一、六种常见的“按位运算”
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
相关文章
暂无评论...