Intermediate C++ Game Programming Tutorial 23
From Chilipedia
Bit twiddling is a lot of bullshit that is usually avoided when possible because it leads to ass code. Still, it is necessary in various situations, so you gotta learn this shit, and now is as good a time as any I guess.
Topics Covered
 Bitwise AND (&), OR (), and shift left/right (>> and <<)
 Unary bitwise NOT/complement (~) and bitwise XOR (^)
 Masking with & and combining with 
 Packing and unpacking smaller data in larger types
 Bit flags
 Bitwise arithmetic optimizations
Video Timestamp Index
 Converting integers to their binary representations 0:25
 Introducing
std::string ToBin(unsigned int n, int min_digits=0);
std::string ToBin( unsigned int n, int min_digits = 0) { std::string bin_str; for ( int count = 0; n!=0  count < min_digits; n>>=1,count++ ) { bin_str.push_back( bool( n & 0b1 ) ? '1' : '0' ); } std::reverse( bin_str.begin(),bin_str.end() ); return bin_str; }
 Introducing
 Bitwise operators AND (
&
), OR (
) 1:50
 Biswise AND (
&
): 1010 & 1100 = 1000, also called a mask  Biswise OR (

): 1010  1100 = 1110, also called a mash
 Biswise AND (
 Shifting operations left (
<<
), right (>>
) 5:10
 Shift left (
<<
): 0011 << 1 = 0110, shifts binary zeros in from the right side into the lower order bit position  Shift right (
>>
): 0110 >> 2 = 0001, shifts binary zeros in from the left side into the highter order bit position  Except for negative integers:
(1)>>n
: ...1111>>2 = ...1111, shifts binary ones in from the left
 Shift left (
 Packing and unpacking data, masking with
&
and mashing/combining with
7:07
 Example: combining four 8bit numbers into one 32bit number by using
<<
and
 Example: unpacking a 32bit number to an 8 bit sequence by using
&
and>>
 Example: combining four 8bit numbers into one 32bit number by using
 Example use case: The
Color
class in the Framework 12:20
 XRGB 8bit values are packed into a 32bit word using
(x<<24u)  (r<<16u)  (g<<8u)  b)
 XRGB 8bit values are packed into a 32bit word using
 Packing flag values into a single integer parameter 14:29
 Used in libraries such as the Windows API, DirectX, in STL
 Each value is represented by a single bit set in their binary representation
 For example:
enum Options { option1 = 0b01, option2 = 0b10 };
 Check for options with Bitwise AND: if you have an
int options
, check the option flag usingif( options & option1 )
 Combine options with Bitwise OR: make an
int options = option1  option3;
 Advanced Bitwise operators NOT (
~
), XOR (^
) 16:48
 Bitwise NOT (
~a
): unary operation that flips all the bits ofa
  Use case: switch off an option:
options &= ~option1;
 Bitwise XOR (
^
): binary operation sets each bit position to 1 only if the bits at that position of the two operands are different
  Use case: a "configurable flipper".
a^0b11110000
will flip the 4 left bits ofa
and leave the 4 right bits the same   Toggle an option:
options ^= option1;
 Bitwise NOT (
 Don't use Bitwise AND in logical operations like
if ( a & b )
19:49

bool(x)
evaluates to false if x==0, otherwise to true 
bool( 0b01 && 0b10 )
is true, whereasbool( 0b01 & 0b10 )
is false  Only reason why you would want to use
&
in logical operations is to avoid short circuiting evaluations with&&
or
  Short circuiting stops evaluating a comparison when the first argument is evaluated
  For instance:
if ( false && ... )
will not evaluate anything after&&
because it is irrelevant   To be safe when you do this, use
if ( bool(a) & bool(b) )

 Bitwise arithmetic optimizations 22:30

x >> n
divides x by 2^n (as in: 2 to the power of n) 
x << n
multiplies x by 2^n (as in: 2 to the power of n) 
x % 16
is equal tox & 15
orx & 0xF
 Note: no need to apply this in your code, the compiler will do this anyway when it optimizes

Homework
 Figure out how the binary string formatter routine works
 Figure out why
x % 16
compiles tox & 0xF
The solution for the problems will not have its own video. Feel free to come on the discord and compare your answers with others, or to ask specific questions if you are having trouble understanding.