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
LEFT-SHIFT 0001 BY 3 = 1000
<<
RIGHT-SHIFT RIGHT-SHIFT 1000 BY 1 = 0100
RIGHT-SHIFT 1000 BY 3 = 0001
>>

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 & 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;
}