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に。