目录
(一) 运算符
& 与运算 两个均为1,则为1,有一个不为1,则为0
| 或运算 两个均为0,则为0,有一个为1,则为1
^ 异或运算 相同为0,不同为1
(二) 规律:
-
n & n-1 把n的最后一位1去掉
-
0 与其他数异或得到这个数本身
-
任何数和他本身异或得到0
-
通常2v在代码中写成 v<<1 。 2v+1写成 v<<1|1
-
a*b:
(三) 应用
一:汉明重量(指计算二进制数中非零符号个数)
思路:用n & (n-1) 去掉最后的1,计数1的个数
n=7=111
111
$110
=110
110
$101
=100
100
&011
=000
例:
def hammingWeight(self, n: int) -> int:
count=0
while n !=0:
n=n & (n-1)
count +=1
return count
二: 汉明距离(指计算两个数字对应的二进制不同位置数字的数量)
思路:两数异或使不同位置的数字不同转化为1,再将数字a &(a-1)去掉末尾的1,计算1的数量
def hammingDistance(self, x: int, y: int) -> int:# 定义函数
a = x ^ y
#两数异或,将不同的数字转化为1
count = 0
while a != 0:
a = a & (a-1)
#去掉末尾的1
count +=1
return count
三:汉明距离总和(指数组中任意两数字的二进制数对应不同位置数字的数量和)
思路:利用两次for循环,内外层循环一起遍历列表中的数字,通过移位并与1进行&运算,得出1与0的个数,最终计算得到汉明距离之和
例:
def totalHammingDistance(self, nums: List[int]) -> int:
res, n = 0, len(nums)
for i in range(32):#for循环遍历每个整数,整数的字节范围为(0,32)
cnt_1 = 0 #1的计数,初始值为0
for j in range(n): #内层循环,范围为(0,len(nums))
# num[j]向右移i位并与1进行&运算,末尾为1,1的个数+1
cnt_1 += (nums[j] >> i) & 1
res += (n - cnt_1) * cnt_1 #(n - cnt_1)*cnt_1 为纵向的汉明距离
return res
四:只出现一次的数字(指计算在给定的数组中只出现一次的数,其余数字出现两次)
思路:将每个数字与其本身进行异或,最终留下的就是只出现一次的数字
例:
def singleNumber( nums) -> int:
res = 0
for i in nums:
res = res ^ i
return res
print(singleNumber([2,4,3,2,3]))
# 2 4 3 2 3
# 0 1 0
# 1 0 0
# 0 1 1
# 0 1 0
# 0 1 1
#顺序改变不影响结果
五:不用加减乘除做加法
class Solution:
def add(self, a: int, b: int) -> int:
x = 0xffffffff
a, b = a & x, b & x
while b != 0:
a, b = (a ^ b), (a & b) << 1 & x
return a if a <= 0x7fffffff else ~(a ^ x)