如果要将整数A转换为B,需要改变多少个bit位?

来源:互联网 发布:如何查看淘宝卖家姓名 编辑:程序博客网 时间:2024/04/28 16:38

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 = 0while 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、……没想到

0 0