Difference between revisions of "Intermediate C++ Game Programming Tutorial 23"

From Chilipedia
Jump to: navigation, search
(Video Timestamp Index)
(Video Timestamp Index)
Line 42: Line 42:
 
</div>
 
</div>
 
* Advanced Bitwise operators NOT (<code>~</code>), XOR (<code>^</code>) [https://youtu.be/WPMwq0qM8Kk?t=16m48s 16:48]
 
* Advanced Bitwise operators NOT (<code>~</code>), XOR (<code>^</code>) [https://youtu.be/WPMwq0qM8Kk?t=16m48s 16:48]
 +
<div class="mw-collapsible-content">
 
** Bitwise NOT (<code>~a</code>): unary operation that flips all the bits of <code>a</code>
 
** Bitwise NOT (<code>~a</code>): unary operation that flips all the bits of <code>a</code>
 
*:- Use case: switch off an option: <code>options &= ~option1;</code>
 
*:- Use case: switch off an option: <code>options &= ~option1;</code>
Line 47: Line 48:
 
*:- Use case: a "configurable flipper". <code>a^0b11110000</code> will flip the 4 left bits of <code>a</code> and leave the 4 right bits the same
 
*:- Use case: a "configurable flipper". <code>a^0b11110000</code> will flip the 4 left bits of <code>a</code> and leave the 4 right bits the same
 
*:- Toggle an option: <code>options ^= option1;</code>
 
*:- Toggle an option: <code>options ^= option1;</code>
 +
</div>
 
* Don't use Bitwise AND in logical operations like <code>if ( a & b )</code> [https://youtu.be/WPMwq0qM8Kk?t=19m49s 19:49]
 
* Don't use Bitwise AND in logical operations like <code>if ( a & b )</code> [https://youtu.be/WPMwq0qM8Kk?t=19m49s 19:49]
 +
<div class="mw-collapsible-content">
 
** <code>bool(x)</code> evaluates to false if x==0, otherwise to true
 
** <code>bool(x)</code> evaluates to false if x==0, otherwise to true
 
** <code>bool( 0b01 && 0b10 )</code> is true, whereas <code>bool( 0b01 & 0b10 )</code> is false
 
** <code>bool( 0b01 && 0b10 )</code> is true, whereas <code>bool( 0b01 & 0b10 )</code> is false
Line 55: Line 58:
 
*:- For instance: <code>if ( false && ... )</code> will not evaluate anything after <code>&&</code> because it is irrelevant
 
*:- For instance: <code>if ( false && ... )</code> will not evaluate anything after <code>&&</code> because it is irrelevant
 
*:- To be safe when you do this, use <code>if ( bool(a) & bool(b) )</code>
 
*:- To be safe when you do this, use <code>if ( bool(a) & bool(b) )</code>
 +
</div>
 
* Bitwise arithmetic optimizations [https://youtu.be/WPMwq0qM8Kk?t=22m30s 22:30]
 
* Bitwise arithmetic optimizations [https://youtu.be/WPMwq0qM8Kk?t=22m30s 22:30]
 +
<div class="mw-collapsible-content">
 
** <code>x >> n</code> divides x by 2^n (as in: 2 to the power of n)
 
** <code>x >> n</code> divides x by 2^n (as in: 2 to the power of n)
 
** <code>x << n</code> multiplies x by 2^n (as in: 2 to the power of n)
 
** <code>x << n</code> multiplies x by 2^n (as in: 2 to the power of n)
 
** <code>x % 16</code> is equal to <code>x & 15</code> or <code>x & 0xF</code>
 
** <code>x % 16</code> is equal to <code>x & 15</code> or <code>x & 0xF</code>
 
** Note: no need to apply this in your code, the compiler will do this anyway when it optimizes
 
** Note: no need to apply this in your code, the compiler will do this anyway when it optimizes
 +
</div>
 +
</div>
  
 
== Homework ==
 
== Homework ==

Revision as of 07:11, 27 November 2019

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

Tutorial 23

[Expand]
  • Converting integers to their binary representation 0:15
    • Introducing std::string ToBin(unsigned int n, int min_digits=0);
  • Bitwise operators AND (&), OR (|) 1:50
  • Shifting operations left (<<), right (>>) 5:10
  • Packing and unpacking data 7:07
  • Example use case: The Color class in the Framework 12:20
  • Packing flag values into a single integer parameter 14:29
  • Advanced Bitwise operators NOT (~), XOR (^) 16:48
  • Don't use Bitwise AND in logical operations like if ( a & b ) 19:49
    • 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 to x & 15 or x & 0xF
    • Note: no need to apply this in your code, the compiler will do this anyway when it optimizes

</div>

Homework

  • Figure out how the binary string formatter routine works
  • Figure out why x % 16 compiles to x & 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.

See also