位运算简单理解

无论在哪门语言都老是遇到位运算。之前我懒,加上考试对这块也考的不多,就随便应付过去了,但现在发现Java、Python、sql都可以用位运算来提高一点运算效率,这里简单记下。

首先给出位运算的符号:

符号作用(简要)作用(具体)
&按位与把两个操作数转化为二进制数,然后每位进行位运算,1&1=1, 1&0=0, 0&0=0,可以理解为,都为真才为真
|按位或把两个操作数都转化为二进制数,然后每位进行位运算,1|1=1, 1|0=1, 0|0=0,可以理解为,至少有一个为真,才为真
~按位取反把操作数转化为二进制数,然后按位取反,1变为0,0变为1
^按位异或把两个操作数都转化为二进制数,然后每位进行位运算,1^1=0, 1^0=1, 0^0=0,可以理解为,相同的数异或结果为0,不同的数异或结果为1
<<按位左移m<<n,表示m的二进制数向左移n位,右边补上n个0
>>按位右移m>>n,表示m的二进制数向右移n位,左边补上n个符号位
>>>逻辑右移m>>n,表示m的二进制数向右移n位,左边补上n个0

以后再补充

22.3.28
这里补充一个例子
刷题遇到的一道题,要求判断一个数的二进制是不是01交替出现。我本来想逐位右移后和1进行&运算来判断的,但一时想不到怎么让右移的循环结束(不想用除法),去参考了下答案,太妙了。

class Solution {
    public boolean hasAlternatingBits(int n) {
        //假设n符合题意,则n右移1位与n的异或结果为01111111等类似的,即后面全为1
        int a = n ^ (n >> 1);
        //将a与a+1进行与运算,为0说明n符合题意
        return (a & (a + 1)) == 0;
    }
}

这里直接对n右移一位,然后和n进行异或运算。比如说n是10101010时,右移一位就变成了01010101,那么异或的结果就是11111111。
把a和a+1进行与运算,则为11111111&00000000,结果肯定为0。这样运算避开了循环的过程,一步到位,真的妙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值