【力扣题】题目描述:
二进制“与”运算:(两个二进制中对应的每一位依次进行“与”运算)
1&1=1,0&1=0,0&0=0
【Python3】代码:
1、解题思路:整数转为二进制字符串,统计二进制字符串中“1”的个数。
知识点:bin(...):转为二进制字符串,即“0bxxx...”。
str.count(“x”):统计x在字符串中有多少个。
class Solution:
def hammingWeight(self, n: int) -> int:
return bin(n).count("1")
2、解题思路:循环检查二进制位。
(2-1)依次将1的二进制左移和n的二进制每一位进行“与”运算,统计“与”运算结果为1的个数。【左移1的二进制】
知识点:range(32):从0到32的一个数组(含0不含32),即0、1、2...30、31。
1 << i:将1的二进制左移i位。
sum(...):求和。
列表推导式:遍历列表,对各元素只有一行代码的简单操作,可简写:[ 元素操作 for 变量 in 列表 if 条件 ]。
class Solution:
def hammingWeight(self, n: int) -> int:
return sum(1 for i in range(32) if n & (1 << i))
# 相当于
alist = []
for i in range(32):
if n & (1 << i):
alist.append(1)
return sum(alist)
(2-2)将n的二进制位依次从低位到高位枚举每一位,和1的二进制进行“与”运算,统计“与”运算结果为1的个数。【右移n的二进制】
知识点:n & 1:获取二进制的最低位。n的二进制和1的二进制进行“与”运算。
n >>= 1:n的二进制右移一位 ,并重新赋值给n。
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
for i in range(32):
if n & 1 == 1:
res += 1
n >>= 1
return res
3、解题思路:位运算的优化。将n的二进制位从低位到高位依次将1消除成0,消除多少次则n的二进制中有多少个1。
知识点:n &= (n-1):n的二进制和n-1的二进制进行“与”运算,并重新赋值给n。结果是将n二进制最低位的1消除为0。
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
n &= n-1
res += 1
return res