【剑指offer】二进制中1的个数(python)
思路:n&(n-1)位运算可以将n的位级表示中最低的那一位1置0。不断将1设置为0,直到n为0。
负数时注意补码转换。
补码:设某负数X,则X+X(反)= 0xFFFFFFFF,所以X+X(反)+1 = 0,可以得出 0 - X = X(反)+ 1这里 0 - X即定义为负数X的补码,这样,计算机在进行X-Y运算时实际可用X+Y(补)代替,硬件角度只需实现加法电路即可。同样的道理,0-X(补)=X(补)(反)+1 = X,即已知负数补码只需对其各位取反加一即可得到原码。
# -*- coding:utf-8 -*- class Solution: def NumberOf1(self, n): # write code here # 注意负数的补码转换 cnt = 0 if n < 0: n &= 0xffffffff while n: cnt += 1 n &= (n-1) return cnt