位运算技巧

按位与 &

按位或 |

按位异或 ^

按位取反 ~

左移<<

右移>>

 

ABA&BA|BA^B
00000
01011
10011
11110

按位与可以类比&&运算符来记

按位或可以类比||运算符来记

按位异或可以用"相同为0,相异为1"

左移相等于乘上2,右移相当于除于2

最常用就是以上五种;

按位与&可以用来判断特定的位是1还是0

按位与&:  (j从0开始)

    1.如果我要判断a的第j为是0还是1的话,只需要计算出a&(1<<j)

     因为01得1   11得1   所以值是非0则a的第 j位为1,如果是0的话该位就是0

    2.如果需要判断一个数a是否为2的次幂,只需要计算出a&(a-1)的值,如果是0的话该数是2的次幂,反之则反之

  因为一个数 是2的幂次的话 二进制只会有一个1  因为二进制已经把2的0次方  1次方  2次方 一位位表示 6=2的2次方+2的1次  方  6并不是2的次幂,而(a-1) 假设a为00100  那(a-1)就是00011  这两个数& 一定得0  

    3.取一个数a的最底位的1,用a&-a,例如20(10) = 10100(2),那么20&-20 = 100(2);   线段树

    4.可以将a的第j位变为0,用a&(0<<j)即可

按位异或^

    1.如果需要将a的第j为取反的话,只需要进行 a^(1<<j)即可;

    2.利用自反性交换两个数,按位异或有个很神奇的性质--自反性 a^b^b = a;

       利用这个性质我们可以不用第三个变量就能交换两个数;

       例如:我们要交换a和b两个,只需要进行以下操作即可;

                  a = a ^ b;  比如10  和 11(基于二进制) a = a^b = 01   b = a^b = 10   a = a^b = 11

                  b = a ^ b;

                  a = a ^ b;

 

按位或:

    1.可以将a的第j位变为1,用a|(1<<j)  00得0 01得1即可

--------------------- 本文来自 糖宋元明清 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/u013377068/article/details/81028453?utm_source=copy

 

 

x & (x << 1)  判断有没有相邻1      010 &100=000       011&110=010    0的话没有相邻1   反之

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值