给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?
解法一:举例说明,为了减少复杂度,就使用八位二进制吧。设 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<iostream> 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<<getNum(E)<<endl; system("pause"); return 0; }
解法二:
思路:对于给定的两个数,从最低位开始扫描,分别找到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<n2) { a&=(~n1); n1=a-(a&(a-1)); } else { b&=(~n2); n2=b-(b&(b-1)); } } } while(n1!=0) { num++; a&=(~n1); n1=a-(a&(a-1)); } while(n2!=0) { num++; b&=(~n2); n2=b-(b&(b-1)); } return num; }
复杂性分析:始终在追踪“1”,因此复杂性为O(V(A|B)),V(A|B)为A|B中的“1”的个数。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】