Manipulating Bits of Any Value Type
"Nordlöw"
per.nordlow at gmail.com
Sun Jan 26 12:56:28 PST 2014
Has anybody cooked up some generic functions that extend
`core.bitop` bitmanipulations to work on any value type?
Something like
bool getBit(T)(in T a, int bitnum); // bt
T setBit(T)(in T a, int bitnum); // bts
auto ref setBitInPlace(T)(ref T a, int bitnum);
I know this is relatively easy to implement so that's why I'm
curious to why its not already Phobos.
**Update:**
Here's my first try at this:
/** Returns: $(D bitnum):th Bit Of $(D a).
TODO: Why is this already in Phobos?
TODO: Make this safe for integers
*/
bool getBit(T, I)(in T a, I bitnum) @trusted pure nothrow if
(isIntegral!I) {
enum nBits = 8*T.sizeof;
static if (nBits == 8) alias I = ubyte;
else static if (nBits == 16) alias I = ushort;
else static if (nBits == 32) alias I = uint;
else static if (nBits == 64) alias I = ulong;
immutable xi = (*(cast(I*)&a));
immutable bitMask = ((cast(I)1 << bitnum));
/* debug dln(eltIx, ",", bitnum, ",", xi, ",", bitMask);
*/
return a & bitMask ? true : false;
}
alias bt = getBit;
My idea to make `getBit` work on all types that have value
semantics. That's why I need the cast (I think). Is there a
traits to check if a type has value semantics or not?
Also is there a trait to check if a type supports a specific
operation such as bitwise and `&`? I could always use
`__traits(compiles, ...)` but standardization is good.
To make it even better I guess I need an explicit overload for
T's that support bit manipulations in order to make this variant
@safe right? In my generic solution above I need the `cast` and
that's @unsafe.
See also:
https://stackoverflow.com/questions/21368664/manipulating-bits-of-any-value-type
More information about the Digitalmars-d-learn
mailing list