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