0
0
Power-electronicsHow-ToBeginner · 3 min read

Bit Manipulation Tricks for Embedded C: Quick Guide

In Embedded C, use &, |, ^, ~, and bit shifts <<, >> to manipulate bits efficiently. Common tricks include setting, clearing, toggling, and checking bits using bit masks for precise hardware control.
📐

Syntax

Bit manipulation uses operators to change or check bits in a number:

  • &: AND - keeps bits set in both numbers
  • |: OR - sets bits if set in either number
  • ^: XOR - toggles bits where bits differ
  • ~: NOT - flips all bits
  • <<: Left shift - moves bits left, adding zeros on right
  • >>: Right shift - moves bits right, discarding bits on left

Use these with masks to target specific bits.

c
/* Set bit n */
value |= (1 << n);

/* Clear bit n */
value &= ~(1 << n);

/* Toggle bit n */
value ^= (1 << n);

/* Check bit n */
if (value & (1 << n)) {
    // bit n is set
}
💻

Example

This example shows how to set, clear, toggle, and check bits in an 8-bit variable.

c
#include <stdio.h>

int main() {
    unsigned char value = 0b00001100; // initial value

    // Set bit 0
    value |= (1 << 0);
    printf("After setting bit 0: 0x%02X\n", value);

    // Clear bit 3
    value &= ~(1 << 3);
    printf("After clearing bit 3: 0x%02X\n", value);

    // Toggle bit 2
    value ^= (1 << 2);
    printf("After toggling bit 2: 0x%02X\n", value);

    // Check bit 1
    if (value & (1 << 1)) {
        printf("Bit 1 is set\n");
    } else {
        printf("Bit 1 is clear\n");
    }

    return 0;
}
Output
After setting bit 0: 0x0D After clearing bit 3: 0x05 After toggling bit 2: 0x01 Bit 1 is clear
⚠️

Common Pitfalls

Common mistakes include:

  • Forgetting to use parentheses around bit shifts, causing wrong order of operations.
  • Using signed types which can cause unexpected behavior with shifts.
  • Not using masks correctly, affecting unintended bits.
  • Confusing bit positions (bit 0 is the least significant bit).
c
/* Wrong: missing parentheses, shifts applied after bitwise OR */
value |= 1 << 3 + 1; // wrong, interpreted as value |= 1 << (3 + 1)

/* Right: use parentheses to clarify */
value |= (1 << (3 + 1));
📊

Quick Reference

OperationCode ExampleDescription
Set bit nvalue |= (1 << n);Turns bit n ON
Clear bit nvalue &= ~(1 << n);Turns bit n OFF
Toggle bit nvalue ^= (1 << n);Flips bit n
Check bit nvalue & (1 << n)Tests if bit n is ON
Left shiftvalue << nMoves bits left by n places
Right shiftvalue >> nMoves bits right by n places

Key Takeaways

Use bit masks with shift operators to target specific bits safely.
Always use parentheses around shifts to avoid operator precedence errors.
Prefer unsigned types for bit manipulation to prevent sign issues.
Test bits using AND with a mask to check their state.
Bit manipulation is essential for efficient embedded hardware control.