剑指 二进制1的个数
调整数组顺序使奇数位于偶数前面
http://www.nowcoder.com/questionTerminal/ef1f53ef31ca408cada5093c8780f44b
通过&确定二进制最右位是否为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