unsigned char st;
エンディアン ビッグエンディアン 左がLSB(least significant bit)
リトルエンディアン 右がLSB
最上位ビット MSB(Most Significant Bit)
0bit目:一番小さい桁
1:状態異常
0:通常状態 左シフト演算 <<
st(0) : 麻痺 1 00000001 << 0 1<<0
st(1) : 睡眠 2 00000001 << 1 1<<1
st(2) : 毒 4 00000001 << 2 1<<2
st(3) : 怒り 8 00000001 << 3 1<<3
st(4) : 悲しみ 16 00000001 << 4 1<<4
st(5~7):未使用 0とする
論理演算:and, or, not
not(0)->1 not(1)->0
and演算(かつ)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
or演算(または)
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
麻痺 1<<0 と 睡眠 1<<1同時
00000011 <= (1<<0)|(1<<1)
ビット bit に i 番目のフラグを立てる => res = bit|(1<<i)
睡眠 1<<1 (00000010)だけ解除
00000011 00000011
?) 00000010 11111101
------------- -------------
00000001 00000001
ビット bit に i 番目のフラグを消す => res = bit&(~(1<<i))
怒り 1<<3 bitがたってますか?(1ですか?)
res = 00000011 & ( 1<< 3)
00000011 00111010
&)00001000 &)00001000
00000000 00001000
if(00000000) => C言語ではfalse
if(00001000) => C言語ではtrue
0以外の値はtrue
0のみfalse
⓪麻痺&睡眠 整数だといくつ?
00000011 3
①麻痺&悲しみ 整数だといくつ?
00010001 17
②毒&怒り&悲しみ 整数だといくつ?
00011100 28
00000001 * 2 = 00000010
00000010 * 2 = 00000100
00000100 * 2 = 00001000
左シフト演算
00001000
00010000
00000000 0
00000001 1
00000010 2
…
11111111 255