読者です 読者をやめる 読者になる 読者になる

uragami note

ただの殴り書き

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