danielljeon.github.io

1 Basic Bit Operations


Table of Contents

1.1 Bitwise AND

uint8_t value = 0b11010110;
uint8_t mask = 0b00001111;
uint8_t result = value & mask; // result = 0b00000110.

1.2 Bitwise OR

uint8_t value = 0b11010100;
uint8_t mask = 0b00000011;
uint8_t result = value | mask; // result = 0b11010111.

1.3 Bitwise XOR

uint8_t value = 0b11010110;
uint8_t mask = 0b00000110;
uint8_t result = value ^ mask; // result = 0b11010000.

1.4 Bitwise NOT

uint8_t value = 0b11010110;
uint8_t result = ~value; // result = 0b00101001.

1.5 Left Shift

uint8_t value = 0b00000101;
uint8_t result = value << 2; // result = 0b00010100.

1.6 Right Shift

uint8_t value = 0b00010100;
uint8_t result = value >> 2; // result = 0b00000101.

1.7 Check if a Specific Bit is Set

uint8_t value = 0b10101010;
uint8_t bit_position = 3;
uint8_t is_set = (value & (1 << bit_position)) != 0; // is_set = true.

1.8 Set a Specific Bit

uint8_t value = 0b10101010;
uint8_t bit_position = 2;
value |= (1 << bit_position); // value = 0b10101110.

1.9 Clear a Specific Bit

uint8_t value = 0b10101010;
uint8_t bit_position = 1;
value &= ~(1 << bit_position); // value = 0b10101000.

1.10 Toggle a Specific Bit

uint8_t value = 0b10101010;
uint8_t bit_position = 0;
value ^= (1 << bit_position); // value = 0b10101011.

1.11 Extract N Bits

uint8_t value = 0b11011011;
uint8_t start_bit = 2;
uint8_t num_bits = 3;
uint8_t mask = (1 << num_bits) - 1;
uint8_t result = (value >> start_bit) & mask; // result = 0b00000110.

1.12 Combine Bytes

uint8_t low_byte = 0x34;
uint8_t high_byte = 0x12;
uint16_t combined = (high_byte << 8) | low_byte; // combined = 0x1234.

1.13 Split a Larger Data Type into Bytes

uint16_t value = 0x1234;
uint8_t low_byte = value & 0xFF;         // low_byte = 0x34.
uint8_t high_byte = (value >> 8) & 0xFF; // high_byte = 0x12.

1.14 Circular Shift

uint8_t value = 0b11010110;
uint8_t result = (value << 3) | (value >> (8 - 3)); // result = 0b10110110.