两个int(32位)整数m和n的二进制表达中,求有多少个位(bit)不同?
最佳答案 问答题库878位专家为你答疑解惑
我先来讲一讲这道题的大概意思:假设我们输入的是 0 和 1:
0的32位二进制中为:000……0(32位) 1的32位二进制中为:000……1(32位)
那么就有一位不同。
方法一:
既然是二进制中,那么就是满二进一,就像我们十进制一样的,满十进一。那么在十进制中我们怎样比较两个数的位数不同呢?是不是把数%10后比较两个值,然后/10再看看下一位,那么对于二进制中呢,我们也是同样的方法,只不过我们此时是以2为讨论对象了。那么我们就像十进制那样做了:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{int m = 0;int n = 0;int count = 0;scanf("%d %d", &m, &n);while (m+n != 0)//{if (((n % 2) != (m % 2))){count++;}n /= 2;m /= 2;}printf("%d", count);return 0;
}
注意是m+n!=0
方法二:
再讲第二种方法之前,我先来讲一讲按位与&和右移操作符>>和按位异或^的运算规则:
按位异或(2进制)^:相同为0,相异为1
按位与(2进制)&:对应的二进制位进行与运算,只要有0就是0,两个同时为1才是1!
右移操作符 >>:逻辑右移:左边用0填充,右边丢弃
算数右移:左边用原该值的符号位填充,右边丢弃
这里只是讲到运算规则,如果想了解更深,之后我会发一篇详细的,欢迎来看哦!
int main()
{int m = 0;int n = 0;int count = 0;scanf("%d %d", &m, &n);for (int i = 0; i < 32; i++){if ((((n >> i) & 1) ^ ((m >> i) & 1)) == 1){count++;}}printf("%d", count);return 0;
}
上述的代码中,我们通过移位然后按位与上1,那么前面的31为都变成了0,就看最后一位了,两个数的最后一位按位异或,如果结果为1的话,那么说明该位置的两数不相等,那么计数器就加一,直至移完为止!
方法三:
我们先将m和n进行按位异或,此时m和n的相同二进制比特位变为0,不同的二进制比特位为1. 之后我们再计算里面有多少个1就可以了。那怎样计算里面有多少个1呢? 我们可以通过 n = n&(n-1).假设n = 15 把n的二进制中最右边的1去掉了1111 - n 1110 - n-1 1110 - n 1101 - n-1 1100 - n 1011 - n-1 1000 - n 0111 - n-1 0000 - n这样我们可以通过计算的此数来判断里面有多少个1.
int Count_bit(int n, int m)
{int tmp = n ^ m;int count = 0;while (tmp){tmp = tmp & (tmp - 1);count++;}return count;
}
int main()
{int n = 0;int m = 0;scanf("%d %d", &m, &n);int ret = Count_bit(m, n);printf("%d", ret);return 0;
}
那么表示22和33中有5为不同,如果不相信可以试着去写出来比较一下哦。
you get到里面的点了吗?
😄😄😄
好了,今天就到此结束了,拜拜!
99%的人还看了
相似问题
- Kotlin学习——kt里的集合,Map的各种方法之String篇
- Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览
- composer切换全局镜像源的方法
- Python通过selenium调用IE11浏览器报错解决方法
- 测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发
- Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- ChatGLM2 大模型微调过程中遇到的一些坑及解决方法(更新中)
- 类方法,静态方法和实例方法的区别及应用场景
- 【链表的说明、方法---顺序表与链表的区别】
猜你感兴趣
版权申明
本文"两个int(32位)整数m和n的二进制表达中,求有多少个位(bit)不同?":http://eshow365.cn/6-37050-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: qt-C++笔记之Qt中的时间与定时器
- 下一篇: 命令行远程操作windows