# C Bitwise Operations Cheat Sheet

## 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 Count = 0;
unsigned int i = 0;

for (i = 0; i < BITS_PER_INT; ++i, Mask <<= 1)