マイコンのプログラミングでよく使うビット演算など
すべて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