[总结] Bitwise operations

7 篇文章 0 订阅

这里总结一下常见的bitwise operations。(C++)

1)shift。

<<是向左shift;>>是向右shift。这个很简单。需要注意的是补位的问题。如果是向左shift,那么没有问题,补的都是0,换句话说,低位补的都是0;如果是向右shift,那么取决于这个数是signed还是unsigned。如果是signed,那还要取决于最高位是1还是0。如果一个signed的数,最高位是1,那么在向右移动的过程中,高位补的是1。背后的逻辑是:一个signed数,最高位是1,证明它是个负数。那么在向右移动的过程中,它始终保持负数。如果这个数是unsigned,那么好办了,永远补0。

2)or

或操作就是,两个operands只要有一个是1,则返回1;只有都是0的情况下才返回0。那么很容易推导得出:一个全1的数跟任何数or结果都是全1;一个全0的数跟任何数or,那么结果就是那个数。

3)and

与操作,两个operands只要有一个是0,则返回0;只有都是1的时候才返回1。推导可得:一个全1的数跟任何数and,结果都是那个数;一个全0的数跟任何数and,则结果就是0。and有一个常见的操作是这样:我们手里有一个数a,我们希望它某些位保持不变,其他的位清零。比如,让a的从第一位到第十位保持不变,第十位以上的都清零。那么我们可以通过and来得到:我们找这样一个数,它的前十位都是1,从第十一位向上都是0。这样两个数进行and,则得到我们需要的结果。

4)xor

抑或操作,两个operands如果一样,则返回0;如果不一样则返回1。如果一个数跟全1进行xor,那么结果就是这个数的所有bit都翻转;如果一个数跟全0进行xor,那么这个数不变。


好,下面说一下怎么得到在3)中说的那个从第一位到第10位都是1,高位都是0的数,只要一句话:

int a = (1 << 11) - 1;
1这个数就是第一位是1,其余都是0。那么它先向左移动11位,则第11位是1,其他位都是0。那么在此基础上减一,则得到从第一位到第十位都是1,其余都是0的数。

接下来我们讨论一下如何取出一个数的所有的奇数位或者所有的偶数位。我们介绍两个常数:

0x55555555
如果把这个十六进制的数化为二进制就会发现,它是所有奇数位都为1,所有偶数位都为0。所以拿一个数来跟他进行and,就会得到这个数所有的奇数位保持不变,所有的偶数位都变0。

0xAAAAAAAA
如果把这个十六进制的数化为二进制就会发现,它是所有的偶数位都是1,所有的奇数位都是0。所以用一个数来跟他进行and,就会得到这个数所有的偶数位保持不变,所有的奇数位变0。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值