Bitwise Notes
Bitfield Notes
/**
* @param $flag Position in the bitfield
* @return Boolean state.
*/
getFlag($flag)
return (($field & $flag) == $flag)
/**
* @param $flag Position in the bitfield
* @param $state TRUE or FALSE state of the flag.
* @return void
*/
setFlag($flag, $state)
$field = ($state ? ($field | $flag) : ($field & ~$flag));
Bitwise AND &
0 & 0 == 0
1 & 1 == 1
1 & 0 == 0
Bitwise OR | Used to add multiple flags together.
0 | 0 == 0
1 | 1 == 1
1 | 0 == 0
Bitwise XOR ^ "exclusive or"
0 ^ 0 == 0
1 ^ 1 == 0
1 ^ 0 == 1
Bitwise NOT ~ Inverts all bits
~0 == 1
~1 == 0
Bitwise AND NOT Used to clear flags.
1111 & ~1 == 1110
1111 & ~2 == 1101
1111 & ~4 == 1011
1111 & ~(2 | 4) == 1001
Bitwise << Multiplies by power of 2. Can produce positive or negative integers.
0001 << 1 == 0010
Bitwise >> Divides by the power of 2. Can produce positive or negative integers.
0010 >> 1 == 0001
Bitwise <<< Multiplies by power of 2. Produce positive integers only.
Bitwise >>> Divides by the power of 2. Produce positive integers only.
In binary system: 0 1 0 0 0 1 0 0
The n-th number: 7 6 5 4 3 2 1 0
01000100 = 2^0*0+ 2^1*0 + 2^2*1 + 2^3*0 + 2^4*0 + 2^5*0 + 2^6*1 +2^7*0 = 4 + 64 = 67.
2^n*b
b = 0 or 1
Raise to 2nd Power = 1 << 4
unsigned char a = 1, b = 3, c = 0;
// a = 00000001
// b = 00000011
// c = 00000000
c = a & b ; // -> 00000001 (Position 0 for a & b are both "true")
c = a | b ; // -> 00000011 (Position 0 and 1 for a | b are "true")
c = a ^ b ; // -> 00000010 (Position 0 for a & b are both "false")
Masking Techniques
Finding if the n-th bit is 1 or 0
if(x & (1UL << p))
{
// here it's going to continue if the bit is 1 // true
}
else
{
// here it's going to enter if the bit is 0 // false
}
Printing the n-th bit
printf("%d" !!(x & (1UL << p)));
Set p-th bit to 0
x &= ~ (1UL << p);
Set p-th bit to 1
x |= 1UL << p;
Negate the p-th bit
x ^= 1UL << p;