Python实现
样例
如把31转换为14,需要改变2个bit位。
(31)10=(11111)2
(14)10=(01110)2
思路
1、比较容易想到的是移位,然后遇到1计数器加1就好了。但是需要注意终止条件,正数循环移位会得到0,负数并不是这样,会得到1000…000,也就是-2**31。因为Java/Python中整数是以32个bit位存储的,第1位是符号位,31位是值。所以我们的移位操作最多进行31次,这个信息也可以做为循环中止条件。
2、如果是统计正整数的bit位中有几个1可以有如下代码:
count = 0
while num:
num &= (num - 1)
count += 1
所以我们可以先对输入的两个数取异或得到num,然后统计num的bit位中有几个1就可以了。但是负数需要特别注意,负数的bit位是补码。而且不能用上面的方法
输入:1, -1
bit位: 1=(0 000…0001),-1=(1 111…111)
异或:-2 = (1 111…110)
因此问题就变成了怎么处理负数:
1、去负号
num ^= -2**31 # 或者
num &= (2**31 - 1)
2、……没想到