users-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bit flags...


From: emacstheviking
Subject: Re: Bit flags...
Date: Thu, 23 Oct 2014 14:38:50 +0100

Final refinement... I know there will be a need for different sets of access flags for classes, interfaces, fields and methods etc so I have this now which I am pleased with:

access_flags(Value, Output) :-
    findall(X, flag_check(Value, accflag, X), Output).

flag_check(Value, Flag, Output) :-
    call(Flag, B, Output),
    On is Value /\ B,
    On > 0.


On 23 October 2014 14:36, emacstheviking <address@hidden> wrote:
My final solution is this, which works and doesn't use global state:

accflag(0x0001, public).
accflag(0x0010, final).
accflag(0x0020, super).
accflag(0x0200, interface).
accflag(0x0400, abstract).

access_flags(Value, Output) :-
    findall(X, flag_check(Value, X), Output).

flag_check(Value, Output) :-
    accflag(B, Output),
    On is Value /\ B,
    On > 0.

Many thanks to Michał Bieliński for invaluable assistance, well, the answer pretty much, I just have to grok it now!

Excellent! :)

Sean.

On 23 October 2014 00:25, "Michał Bieliński" <address@hidden> wrote:
Dnia 22 Października 2014, 00:54, Śr, emacstheviking napisał:
> I really didn't think this would be so difficult! I have tried for
> several hours now to find an elegant solution to my problem:
> given a 32 bit value, create a list of atoms that represent
> the names of those bit positions of interest.

Until this point it sounds easy.

> %% these define the bit positions of interest
> accflag(0x0001, public).
> accflag(0x0010, final).
> accflag(0x0020, super).
> accflag(0x0200, interface).
> accflag(0x0400, abstract).

Bit positions those are not. They are bit values.

Those are bit positions:
accflag(0, public).
accflag(4, final).
accflag(5, super).
accflag(9, interface).
accflag(10, abstract).

> %% predicate to convert Value into a list of accflag/2 names.

My way:

access_flags(Value, Output) :-
    findall(X, flag_check(Value, X), Output).

flag_check(Value, Output) :-
    accflag(X, Output),
    g_assign(z, Value),
    g_test_set_bit(z, X).

> AAARGGGGH! Next month will be my 30th year in software and it
> gets better every day!

Just out of curiosity, how do you count the time? From your first hello
world? From first year of working as programmer? Something else?

--
Michał Bieliński


_______________________________________________
Users-prolog mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/users-prolog



reply via email to

[Prev in Thread] Current Thread [Next in Thread]