Subscribed unsubscribe Subscribe Subscribe

マイコンのプログラミングでよく使うビット演算など

メモ

すべてnは0始まり,xはunsignedと仮定.

nビット目が1かどうか判定

if(x & (1 << n))

ビットに1をセット

x |= 0xF0; // 10100110 -> 10101111

下位nビットを1で埋めるなら,これでも.

x |= (1 << n + 1) - 1;

あるいはnビット目だけを1に.

x |= (1 << n);

ビットに0をセット

下位4ビットを0で埋める.

x &= ~0x0F; // 10100110 -> 10100000

nビット目を0に.

x &= ~(1 << n);

ビットを反転

全部反転ならもちろんNOT.

x = ~x; // 00010111 -> 11101000

ある範囲だけ反転なら,反転させたい範囲を1にしたビットとのXOR.

x ^= 0x0F; // 00110011 -> 00111100

1,0しか取らない変数のとき.if(x==0) x = 1; else x = 0;よりは

x = 1 - x;

のほうが簡潔.同じ理屈でa,bしかとらない変数の値をスイッチするとき,ifを使う必要はない.

x = a + b - x;

あまり使わないかも

一番右の0を1に.

x |= x + 1; // 00100111 -> 00101111

xが2のべき乗かどうか.

if((x & (x - 1)) == 0)

一番右の1だけビットを立てる.

x & (-x); // 10101000 -> 00001000

一番右の0だけビットを立てる.

~x & (x + 1); // 10100111 -> 00001000

nビットの循環左シフト.xはX型とする.

x = (x << n)|(x >> (sizeof(X) - n); // n=2のとき 01100101 -> 10010101