关于位运算的一些技巧和操作

---恢复内容开始---

首先介绍以下 我知道的这几种位运算操作符。

">>"这个是右移一位 比如 “10000”右移一位就变成了“1000” 比如 0b1001 >> 1 结果就是 0b100

"<<"这个就是左移操作  比如 0b1001 << 2 结果就是 0b100100。

“&”按位与, 这个直接看例子 0b10 与ob11 结果就是 0b10这个操作符就是 在同一个位置 如果 两位都是 1那么结果也是 1如果两个数的相同位置有一个是0,那么结果对应位置就是零。

"&" 可以用于过滤,比如我想判断最后一位是0还是1可以用 a&1过滤结果就是a的最后一位。

"^"按位异或 就是如果对应位置相同则结果是0,如果对应位置不相同则结果是1 比如0b1100 和 0b0001 结果就是 0b1101 

“~”取反 就是 原先对应位置0变成1, 1 变成0,比如 0b1100 取反之后就是 0b0011

我们来看一道leetcode上的题目是关于2的幂次的 题目里说 如果是 2的幂次方就返回 True否则返回False。比如 4就是2的二次方,1就是2的0次方。

当然我们可以用整除的方法来做,最后如果结果是一就返回True。但是我们学了位运算, 我们可以使用位运算来做。

首先我们观察一下二的幂次方的二进制特点 2的三次方也就是8就是 0b1000,2的一次方 0b10。发现了吧它除了首位是 1其他位置都是零。我们可以用 &来做。

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n == 0:
            return False
        if n == 1:
            return True
        elif (n&(n-1)) == 0:
            return True
        else:
            return False

我们看一下 n 与 n-1 的差别 比如说一个数字 是 ob1000000 那这个数的n-1 就是 0b0111111

如果我们使用 & 操作 结果 就是 0b0000000也就是零 所以 我们 如果 n&(n-1)结果是0那么n就是2的幂次,如果不是零那么n就不是 2的幂次。

n&(-n)的结果是n的二进制中从后往前数第一个出现的1的结果,就是最靠右边的一个 一;

比如 11110000它的负数就是按位取反再加1就是00001111 + 1 就是00010000前边全是1省略没写的全是1;

他们&的结果就是 00010000;

这个题目可以用于解leetcode的power of two那题;https://leetcode-cn.com/problems/power-of-two/

代码就是

bool isPowerOfTwo(int n){
    return n > 0 && (n&-n) == n;

}

转载于:https://www.cnblogs.com/python-zkp/p/10636807.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值