bit置換

ある値のn bit目からn+m bit目までを別の値で置き換えたい、という時がある。

例えば、以下のような値a,bがあったとして

uint8_t a = 0b01010101;  // 0x55
uint8_t b = 0b10101010;  // 0xAA

aの値の2〜4bit目をbの値で置き換えた値cを求めたい。
a,bが上記の値だった場合、cの値は0x49になる。

a: 01010101 (0x55)
b: ***010**
------------
c: 01001001 (0x49)

これを行うbit演算はこうなる。

uint8_t offset = 2;
uint8_t len = 3;
uint8_t mask = (~(0xFF << len)) << offset;
uint8_t c = (a & ~mask) | (b & mask);

以前に書いたものをまた使う機会があったのでメモとして残しておく。
テストコードはGistに。