通过&确定二进制最右位是否为1,然后再右移进位,这样循环判断32位中有多少为1。&表示整数与0……01(31个0)进行与计算。>>1表示二进制向右移1位,
class Solution:
def NumberOf1(self, n):
# write code here
count=0
for i in range(32):
if n&1==1:
count+=1
n=n>>1
return count通过n-1,使得n的二进制最右边的1变为0,最右边1后面的所有0(如果有的话)变为1,这样与原来的n进行与操作,就得到了将最右边1以及之后的数字都变成0的结果,这样的循环操作,条件n!=0就可以直到对应二进制中到底有多少位1。
其中需要注意的是,python中对于负数的二进制表示是在前面加负号,而对于十六进制的负数,他的负数刚好是其二进制的补码表示。所以如果遇到一个负数,先将他和0xffffffff进行与操作,将其也变成十六进制,这样就可以得到他的二进制补码表示。
python 中没有位数这个概念。
也可以理解成 n&0xffffffff得到一个整数,而这个整数二进制中含1个数与其负数补码形式含1个数相同。
总之 负数 n&0xffffffff就是求其补码。
https://blog.csdn.net/u010005281/article/details/79851154
https://www.zhihu.com/question/314455297
class Solution:
def NumberOf1(self, n):
# write code here
count=1
if n<0:
n=n&0xffffffff
if n==0:
return 0
while n&(n-1)!=0:
count+=1
n=n&(n-1)
return count
京公网安备 11010502036488号