按位运算符

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个位置

最后要注意的是& | 和&& ||的区别。前者操作的是位,后者操作的是整个值。

   



  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值