Python简化算法工具——“按位运算”

一、六种常见的“按位运算”

1. 与(&)运算

运算规则:对两个整数的二进制位进行逐位比较,仅当两个相应的二进制位均为1时,结果位才为1,否则为0。

a = 5  // 二进制表示:0101
b = 7  // 二进制表示:0111
print(a & b)
// 计算结果:0101
// 对应的十进制数:5

2. 或(|)运算

运算规则:对两个整数的二进制位进行逐位比较,只要两个相应的二进制位中有一个为1,结果位就为1。

a = 5  // 二进制表示:0101
b = 7  // 二进制表示:0111
print(a | b)
// 计算结果:0111
// 对应的十进制数:7

3. 异或(^)运算

运算规则:对两个整数的二进制位进行逐位比较,当两个相应的二进制位不同时,结果位为1;相同则为0。

a = 5  // 二进制表示:0101
b = 7  // 二进制表示:0111
print(a ^ b)
// 计算结果:0010
// 对应的十进制数:2

4. 取反(~)运算

运算规则:对一个整数的二进制位进行逐位取反,0变为1,1变为0。需要注意的是,计算机中的整数表示是基于补码形式的。

a = 5  // 八位二进制原码:0000 0101
print(~a)
// a的补码与原码相同:0000 0101
// 取反后的补码:1111 1010,对应的原码为1000 0110,即十进制的-6
// 对应的十进制数:-6

5. 左移(<<)运算

运算规则:将一个整数的二进制位向左移动指定的位数,右侧空出的位补0,这相当于将原数乘以2的移动位数次方。

a = 5  // 二进制表示:0101
print(a << 2)
// 左移两位:0001 0100
// 对应的十进制数:20

6. 右移(>>)运算

运算规则:将一个整数的二进制位向右移动指定的位数。对于无符号数,左侧空出的位补0,这相当于将原数除以2的移动位数次方。

b = 8  // 二进制表示:1000
print(b >> 2)
// 右移两位:0010
// 对应的十进制数:2

二、按位运算在算法中的运用思维

1. 求最小偶倍数

通解:使用辗转相除法。

class Solution:
    def smallestEvenMultiple(self, n: int) -> int:
        a, b = n, 2
        while b:
            a, b = b, a % b
        return 2 * n // a

按位运算:利用移位和与运算(根据题意,当 n 为奇数时,答案为 2n,当 n 为偶数时,答案为 n)。

class Solution:
    def smallestEvenMultiple(self, n: int) -> int:
        return n << (n & 1)  # (n & 1): 当n为偶数时运算得0不移位,奇数运算得1,移动一位即X2

2. 判断幂数

通解:用该数一直除以2,除到最后剩1则为true。

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        while n > 0 and n % 2 == 0:
            n //= 2
        return n == 1

按位运算法:

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        return n > 0 and n & (n - 1) == 0
版权声明:程序员胖胖胖虎阿 发表于 2024年12月24日 下午4:31。
转载请注明:Python简化算法工具——“按位运算” | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...