- 首先把n和1做与运算,判断n末尾是不是1,然后将flag左移一位,判断第二位是不是1,但是如果不设置flag<2**32,会陷入死循环
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
flag = 1
while flag < 2**32:
if n & flag:count += 1
flag = flag << 1
return count
- 把一个整数减去1,再和自己做与运算,就会将整数中最右边的1变为0,能做几次这样的操作,就有多少个1.而对于负数,最高位为1,而负数在计算机是以补码存在的,往右移,符号位不变,符号位1往右移,最终可能会出现全1的情况,导致死循环。与0xffffffff相与,就可以消除负数的影响
例如:-3与0xf作与,会得到1101,这样是4位,和0xffffffff相与就是32位class Solution:
def NumberOf1(self, n):
# write code here
count = 0
if n < 0:
n = n & 0xffffffff
while n:
count += 1
n = (n - 1) & n
return count