给定两个整数A和B,把A变为B需要改变多少位(bit)?

题目的意思就是,如何判断A和B的二进制表示中有多少位(bit)不一样?
        这是编程之美当中一道练习题,我也就邯郸学步的想了一个算法:

        1. 先做位与运算  A & B, 得到结果C;

        2. 接着做位或运算 A | B,得到结果D;

        3. 再做一次异或运算,不过操作的数不是 A 与 B,而是 C ^ D , 得到结果E;

        4. 判断结果 E 其二进制表示中1的个数就得到结果啦。

        以下举例说明,为了减少复杂度,就使用八位二进制吧。设 A = 0010 1011, B = 0110 0101.

        1. C =  A & B = 0010 0001;

        2. D = A | B = 0110 1111;

        3. E = C ^ D = 0100 1110;

        4. 结果E中有4个1,那么也就是说将A变成B,需要改变4位(bit)。

        至于如何判断E的二进制表示中有几个1,请参考编程之美p33。

       算法原理如下:

       1. A & B,得到的结果C中的1的位表明了A和B中相同的位都是1的位;

       2. A | B, 得到的结果D中的1的位表明了A和B在该位至少有一个为1的位,包含了A 与 B 都是1的位数,

       经过前两步的位运算,,C 中1的位表明了A 和 B在该位都是1,D中为0的位表明了A 和 B 在该位都是0 ,所以进行第三步。

       3. C ^ D,E 中为1的位表明了A 和 B不同的位。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值