C Bitwise Operations Cheat Sheet

1 minute read

Operations Table

Operation Sample C Operator
AND 1001 AND 0101 = 0001 & (ampersand)
OR 1001 OR 0101 = 1101 | (pipe)
NOT NOT 1001 = 0110 ~ (tilde)
XOR 1001 XOR 1011 = 0010 ^ (caret)
LEFT-SHIFT LEFT-SHIFT 0001 BY 1 = 0010 <<
RIGHT-SHIFT RIGHT-SHIFT 1000 BY 1 = 0100 >>

C Assignment Operators

Operation Syntax Short For
AND X &= Y; X = X & Y;
OR X |= Y; X = X | Y;
XOR X ^= Y; X = X ^ Y;
LEFT-SHIFT X <<= Y; X = X << Y;
RIGHT-SHIFT X >>= Y; X = X >> Y;

Setting and Checking Bit-Flags

#include <stdlib.h>
#define FLAG_ONE 0x0001     /* 0001 */
#define FLAG_TWO 0x0002     /* 0010 */
#define FLAG_THREE 0x0004   /* 0100 */

int main(void)
{
  unsigned int Flags = 0x0000; /* Initialize to zero */
  Flags |= FLAG_ONE;           /* Flags now contains 0001 */
  Flags |= FLAG_THREE;         /* Flags now contains 0101 */

  /* will return EXIT_SUCCESS since we never set FLAG_TWO: */
  return (Flags & FLAG_TWO) ? EXIT_FAILURE : EXIT_SUCCESS;

Counting Set Bits

#include <stdlib.h>
#include <stdio.h>
#define BITS_PER_INT ( sizeof(unsigned int) * 8 )
 
int main(void)
{
  unsigned int Flags = 0x0115; /* Dec: 277, Bin: 100010101 */
  unsigned int Mask = 0x0001;
  unsigned int Count = 0;
  unsigned int i = 0;

  for (i = 0; i < BITS_PER_INT; ++i, Mask <<= 1)
    if (Flags & Mask)
      ++Count;

  // The following line should print: Flags contains 4 set bits.
  printf("Flags contains %d set bits.\n", Count);
  return EXIT_SUCCESS;
}