按位与运算常用于掩码.所以掩码指的是一些设置为开(1)或关(0)的位组合.
flages = flages & MASK ;
把flages除一号位以外的所有位设置为0,因为使用按位与运算符&任何位与0组合都得0.
1号位不变(如果一号位是1,那么1&1得1,如果1号位是0,那么0&1得0,这个过程叫做使用掩码.
MASK 0 0 0 0 0 0 1 1
flages 1 0 0 1 0 1 1 0
0 0 0 0 0 0 1 0
把除了1号位,其他位都设为0
flages = flages & MASK
也可以简化为 flages & =MASK
打开位:
如果为了打开某位,而让其他位不变,那就用位与|
例如
flag =flage | MASK
上例中MASK只有一号位为1,其他位都为0,在位或运算中,任何位与1结合都为1,与0结合都为本身
所以,flag 除了一号位打开,其他位都为本身
第二个例子
flag | MASK
(00001111) |(10110110)
MASK 中为1的位,flag与对应的位也为 1 ,MASK 中为0的位,flag 对应的位不变
关闭位:
如果要关闭特定的位,例如关闭flags中的一号位,同样MASK 只有一号位为1
flags = flags & ~MASK
MASK只有一号位为1 ,其他位都为0,所以 ~MASK 的一号位位 0 ,其他为都为 1 ,位与运算中,
于1结合都为本身,与0结合都为0,所以一号位的初始值,都将设为0
假设 flags是00001111,MASK是10110110
flags = flags & ~MASK
即(00001111)&~(10110110)
结果为(00001001)
MASK中为1的位都被关闭,为0的位不变.
切换位:
切换位是指将关闭了的位打开,或者把打开了的位关闭,这时候可以用异或^,异或是指如果b为1,那么b^1=0,b^0=1
也就是说,用异或,两个都是一样的,那么得0
flags = flags ^ MASK ;
例如flags是00001111,MASK 是10110110,
(0 0 0 0 1 1 1 1) & (1 0 1 1 0 1 1 0)
结果为:
(1 0 1 1 1 0 0 1)
flag中与MASK为1对应的位都切换了,MASK为0的位都对应不变.
检查位的值 :
有时想检查有的位是否为1,这时可以设置,一个某位为1,其他为0的掩码
例如 MASK只有一号位为1,其他都为0
flags & MASK
if((flags&MAPSK)==MASK)
puts("Wow!");