ビットマスクの種類まとめ

◯ビットセット

#define SET(x,y) (x |=(1<<y))	

x |= ( 1 << y )
x = x | ( 1 << y)

例:0000 0000の2ビット目をセットするとき
x = 0000 0000 | 1 << 2
= 0000 0000 | 0000 0001 << 2
= 0000 0000 | 0000 0100
= 0000 0100

◯ビットクリア

#define CLR(x,y) (x &= (!(1<<y))) 

x &= ( ! ( 1 << y ) )
x = x & ( ! ( 1 << y ) )

例:1111 1111の2ビット目をクリアするとき
x = 1111 1111 & ( ! ( 1 << 2 ) )
= 1111 1111 & ( ! ( 0000 0001 << 2 ) )
= 1111 1111 & ( ! ( 0000 0100 ))
= 1111 1111 & ( 1111 1011 )
= 1111 1011

◯ビットチェック

#define CHK(x,y) (x & (1<<y)) 

x & ( 1 << y )

例:0b 1111 0000 (240)の2ビット目がセットされているかチェックするとき
Result = 1111 0000 (240) & 0000 0100(4)
1111 0000
x) 0000 0100

                                  • -

000 0011 1100 0000
は間違い!&はビット演算子であって掛け算の演算子*ではない。
やり直し。
例:1111 0000 の2ビット目がセットされているかチェックするとき
Result = 1111 0000 & 0000 0100
= 0000 0000
Result = 0なのでセットされていない。
例:1111 0000 の4ビット目がセットされているかチェックするとき
Result = 1111 0000 & 0001 0000
= 0001 0000
Result > 0なのでセットされている。

◯ビットトグル→XOR(排他的論理和)を使う

#define TOG(x,y) (x^=(1<<y)) 

x ^= ( 1 << y )
x = x ^ ( 1 << y)

例:0000 0000の2ビット目をトグルする時
x = 0000 0000 ^ ( 0000 0001 << 2)
= 0000 0000 ^ 0000 0100
= 0000 0100