In some protocols or hardware applications (e.g. graphic rendering, signal encoding), bit spreading or interleaving is used to insert 0s between the bits of a value for purposes like data alignment or transmission.
You are given an 8-bit number, and your task is to:
Example Logic
Original (8-bit):
b7 b6 b5 b4 b3 b2 b1 b0Spreading result (16-bit):
0 b7 0 b6 0 b5 0 b4 0 b3 0 b2 0 b1 0 b0
Example-1
Input: val = 0b11001010 (Decimal 202)
Output: 0b0101000001000100 → Decimal: 20548Example-2
Input: val = 0b10101010
Output: 0b0100010001000100 → Decimal: 17476Example-3
Input: val = 0b11111111
Output: 0b0101010101010101 → Decimal: 21845
In C, bitwise operations allow direct manipulation of individual bits within a byte, word, or register. These operations are performed using the following operators:
Common bit-masking patterns:
reg |= (1 << n); // Set bit n
reg &= ~(1 << n); // Clear bit n
reg ^= (1 << n); // Toggle bit n
if (reg & (1 << n)) // Check if bit n is setThese operations are used to target and modify only specific bits, without disturbing others.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Value | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
E.g.
reg |= (1 << 3)reg &= ~(1 << 6) reg & (1 << 0)reg ^= (1 << 3)Bitwise techniques apply the same way for uint32_t types — often used in 32-bit MCUs for status/configuration registers.
Example:
ctrl_reg |= (1U << 23); // Set bit 23 in a 32-bit control register
1 << n must be inside parentheses during masking:reg |= (1 << 4) vs ❌ reg |= 1 << 4 & 0xFuint8_t, uint16_t, or uint32_t.reg = (1 << 2); // WRONG: overwrites entire register
reg |= (1 << 2); // RIGHT: sets only the 2nd bit