题目
给你一个整数a,数出a在二进制表示下1的个数,并输出
思路
对于一个二进制整数,将它减一和它本身相与,会把这个整数最右边的1变为零。
解释
先讨论正数
举例说明,比如 这个数字是9
第一步:
9的二进制表示为 0000 1001
8的二进制表示为 0000 1000
8和9相与的结果二进制表示为 0000 0001 ,表示的数字为 1
第二步:
让 1在和 0相与
1的二进制表示为 0000 0001
0的二进制表示为 0000 0000
相与的结果为 0000 0000 表示的数字为0
我们发现,9的二进制形式里面有2个1,正好相与了两次结果变成了0。因此得出结论:一个数的二进制形式中1的个数等于 将这个数和这个数减一的值相与,将相与的到的数作为新的数,接着和其减一相与,知道结果变为0,中间的相与的次数。
接下来再来讨论负数
负数我们在计算时使用了他的补码进行计算,将最高位的符号位取反就可以获得补码,通常我们采用和0xFFFFFFFF相与来得到。这样得到了一个32位的二进制数据。
例:
这里以 -9为例
-9的 原码为 10010000
-9和0xFFFFFFFF相与的结果为 1111 1111 0110 1111
发现 补码中0的个数正好就是原来数的二进制形式的1的个数,所以负数的二进制形式的1的个数就是(32 - 补码中1的个数)
python代码示例
n =9
if n < 0:
n & 0xffffffff
count = 0
while n :
count += 1
n = n & (n-1)
if n <0:
print (32-count)
else:
print count
网友评论