博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?...
阅读量:7143 次
发布时间:2019-06-29

本文共 1205 字,大约阅读时间需要 4 分钟。

解法一:举例说明,为了减少复杂度,就使用八位二进制吧。设 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,可以采用快速移位与方法。
算法原理如下:
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不同的位。

代码:

#include
using namespace std;int getNum(int n){ if(n==0) return 0; int count=0; while(n) { n&=(n-1); count++; } return count;} int main(){ int A=43,B=101; int C=A&B; int D=A|B; int E=C^D; cout<
<

解法二:

思路:对于给定的两个数,从最低位开始扫描,分别找到A和B的第一个“1”出现的位置,n1和n2

1. n1==n2,将n1(n2)位置0,继续往高位找;
2. n1<n2, 说明A的n1位为1,但B的n1位为0,num++;将A的n1位置0,继续寻找A的下一个1的位置;
3. n1>n2, 同2)反之。

代码:

int count(int a, int b){    unsigned int n1,n2,num=0;    n1=a-(a&(a-1));    n2=b-(b&(b-1));    while((n1!=0)&&(n2!=0))    {        if(n1==n2)        {            a&=~n1;            b&=~n2;            n1=a-(a&(a-1));            n2=b-(b&(b-1));        }        else        {            num++;            if(n1

复杂性分析:始终在追踪“1”,因此复杂性为O(V(A|B)),V(A|B)为A|B中的“1”的个数。。

转载地址:http://rcgrl.baihongyu.com/

你可能感兴趣的文章
Sencha应用程序的UI测试
查看>>
Azure运维系列 1:使用Azure云助理掌控云中机房
查看>>
简单安装Oracle网格控制器agent端
查看>>
mysql的group_concat函数
查看>>
让“云”无处不在-Citrix Xenserver之三 license server
查看>>
10分钟被动添加20精准粉丝,有手机就能操作!
查看>>
活动分区丢失导致的Windows 8无法启动
查看>>
轻松上手移动互联——百度SiteApp建造日志
查看>>
注意你生活中的非政府“棱镜”组织
查看>>
Eclipse下Pydev在线安装失败及解决办法
查看>>
艾伟_转载:C# Design Patterns (2) - Strategy
查看>>
谷歌为URL缩短服务goo.gl开放API
查看>>
HDU_1517 A Multiplication Game
查看>>
C# WinForm开发系列 - 开篇
查看>>
js实现队列互联网机顶盒实战应用
查看>>
IT的哥一样是传说!
查看>>
MVC中的统一验证机制~终极了(自己的改良版)
查看>>
VC中建立程序的关联文件
查看>>
IOS core text计算文本高度及最大宽度
查看>>
Lighthead - SiteCrawler
查看>>