1.按位取反或者二进制补码:~
把1变为0,把0变为1
2.按位与 :&
任何位与0组合都为0,任何位与1组合都为本身
应用:关闭位(清空位)需要打开一个值中的特定位,同时保持其他位不变(所有位为0)
把1变为0,其余位不变。假设有一个二进制数00011010 ,从左到右的第4位1表示开关,现在要关闭开关(置为0)。而其余的位表示其他功能,这些功能不变。所以此时你只能改变第四位。于是可以与一个二进制数11101111结果为00001010.只有第四位变了。
应用2:检查某一位是否为1.比如检查flag中的第一位是否为1.可以用if((flag & 1000) == 1000)printf("Yes!");注意不能用if(flag == 1000),printf(“yes!”);
应用3:掩码。与0不管什么位结果都是0,相当于把值覆盖了,你不知道那个值是什么。与1的话,不管什么位结果都是那个值的位,相当于把那个值暴露出来了。
3.按位或: |
任何位与1组合都为1,任何位与0组合都为本身
应用:打开位(设置位) 需要打开一个值中的特定位,同时保持其他位不变。
再进一步讲,打开位是把0变为1(习惯上0为关闭,1为打开)不变的位与0组合,要变的位与1组合。可参考与去思考
4.按位异或:^
相同为0,不同为1
应用:相同为0不同为1也可以解释为假设一个位为b,0^b是b。所以用0可以不改变原值。用1去异或取决与原值是什么。如果是0,1^0为1,如果是1,1^1为0.基于这种特性,可以用作切换位。假设原值为00001111,你有两个开关分别用从左往右第三位和第五位来表示,那么异或的那个值的第三位和第五位用1.其余用0表示不变(不会改变其他位的功能)所以用00101000,结果为00100111。结果显示只有第三位(将0变为1)和第五位(将1变为0)变了。所以是切换位。
5 左移 <<
左移n位,在保持位数不变的情形下,最左边的n位移除了,其余位依次往左移,最后用0填充最右边空出的n个位置。
int s = 1; s <<=2; 将2变为二进制数为0001,左移2位为0100 ,0100 转化为十进制是4.
6.右移 >>
右移n位,在保持位数不变的情形下,最右边的n位移除了,其余位依次往右移,最后用0填充最左边空出的n个位置
最后要注意的是& | 和&& ||的区别。前者操作的是位,后者操作的是整个值。