unsigned - Using bit masking to set 0 to 1 and everything else to 0 -
how use bit masking make bits in number 1 if 0, , 0 if not?
using unsigned variable:
so, if have 0000-0000
, become 1111-1111
. if have 0101-0110
(or 0000-0001
, or 1111-1111
, etc), become 0000-0000
.
is possible without using conditional?
sure, it's possible:
int y = 0xff; y = ~(y & 1 | y>>1 & 1 | y>>2 & 1 | ...) - 1
but unless academic exercise, shouldn't. if you're concerned performance, y = y != 0
faster.
explanation:
y & 1
takes first bit of number. y >> k
shifts number right k
bits, allowing bit y >> k & 1
. |
them together, results in 1 if bit set or 0 if not. subtracting 1 gives 0 if bit set, , -1 if not. binary representation of -1 1111...
shift:
1010 - y 1010 - y >> 0 101 - y >> 1 10 - y >> 2 1 - y >> 3
take first bit:
0 - y >> 0 & 1 1 - y >> 1 & 1 0 - y >> 3 & 1 1 - y >> 4 & 1
or them:
1 - 0 | 1 | 0 | 1
negate:
0000 - 1-1
Comments
Post a Comment