[编程题] ** 两个整数二进制位不同个数 **(拓展++)
Posted 玄澈_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[编程题] ** 两个整数二进制位不同个数 **(拓展++)相关的知识,希望对你有一定的参考价值。
题目:输入两个整数,求两个整数二进制格式有多少个位不同
前置问题引入
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
tips:求的是补码的二进制个数
C语言代码解决 ——方法一
利用 >> 与 按位与& 实现计算函数的操作size_t count_bit_one(int n) { int i = 0; int count = 0; for (i = 0; i < 32; i++) { if (((n >> i) & 1) == 1) count++; } return count; }
int main() { int num = 0; scanf("%d", &num); int ret = count_bit_one(num); printf("%d", ret); return 0; }
方法二
这边有个关键点是要使用 “unsigned int”,要不然会导致负数传入后无法正常使用该函数
size_t count_bit_one(unsigned int n) { int count = 0; while (n) { if (n % 2 == 1) count++; n /= 2; } return count; }
方法三 (best)
N = N & (N - 1)
size_t count_bit_one(unsigned int n) { int count = 0; while (n) { n = n & (n - 1); count++; } }
图片解析
拓展思考
我们可以运用方法三的方式去解决另外一个问题
:如何判断一个数是不是2的n次方数(等价于判断二进制码中是否只有一个1)
我们可以这样:
if( n & (n - 1) == 0) { //n就是2的次方数 }
大家可以思考思考为什么哦?
题目:输入两个整数,求两个整数二进制格式有多少个位不同
方法一
int main() { int n1 = 0; int n2 = 0; scanf("%d%d", &n1, &n2); int count = 0; int i = 0; for (i = 0; i < 32; i++) { if (((n1 >> i) & 1) != ((n2 >> i) & 1)) count++; } printf("%d\\n", count); return 0; }
也可以选择封装成一个函数哦
方法二
int main() { int n1 = 0; int n2 = 0; scanf("%d%d", &n1, &n2); int t = n1 ^ n2; int count = 0; while (t) { t = t & (t - 1); count++; } printf("%d\\n", count); return 0; }
结合引入问题的方法来进行解决
补充题
打印整数二进制的奇数位和偶数位
int main() { int num = 0; scanf("%d", &num); int i = 0; for (i = 31; i >= 1; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\\n"); printf("奇数位\\n"); for (i = 32; i >= 1; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\\n"); printf("偶数位"); return 0; }
这就是今天的全部内容啦,如果觉得有帮助的话,请给小玄:
以上是关于[编程题] ** 两个整数二进制位不同个数 **(拓展++)的主要内容,如果未能解决你的问题,请参考以下文章