题目:输入两个整数,求两个整数二进制格式有多少个位不同
前置问题引入
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
tips:求的是补码的二进制个数
C语言代码解决 ——方法一
利用 >> 与 按位与& 实现计算函数的操作
size_tcount_bit_one(intn) { inti = 0; intcount = 0; for (i = 0; i < 32; i++) { if (((n >> i) & 1) == 1) count++; } returncount; }
intmain() { intnum = 0; scanf("%d", &num); intret = count_bit_one(num); printf("%d", ret); return0; }
方法二
这边有个关键点是要使用 “unsigned int”,要不然会导致负数传入后无法正常使用该函数
size_tcount_bit_one(unsignedintn) { intcount = 0; while (n) { if (n % 2 == 1) count++; n /= 2; } returncount; }
方法三 (best)
N = N & (N - 1)
size_tcount_bit_one(unsignedintn) { intcount = 0; while (n) { n = n & (n-1); count++; } }
图片解析
拓展思考
我们可以运用方法三的方式去解决另外一个问题
:如何判断一个数是不是2的n次方数(等价于判断二进制码中是否只有一个1)
我们可以这样:
if( n & (n-1) == 0) { //n就是2的次方数 }
大家可以思考思考为什么哦?
题目:输入两个整数,求两个整数二进制格式有多少个位不同
方法一
intmain() { intn1 = 0; intn2 = 0; scanf("%d%d", &n1, &n2); intcount = 0; inti = 0; for (i = 0; i < 32; i++) { if (((n1 >> i) & 1) != ((n2 >> i) & 1)) count++; } printf("%d\n", count); return0; }
也可以选择封装成一个函数哦
方法二
intmain() { intn1 = 0; intn2 = 0; scanf("%d%d", &n1, &n2); intt = n1 ^ n2; intcount = 0; while (t) { t = t & (t-1); count++; } printf("%d\n", count); return0; }
结合引入问题的方法来进行解决
补充题
打印整数二进制的奇数位和偶数位
intmain() { intnum = 0; scanf("%d", &num); inti = 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("偶数位"); return0; }
这就是今天的全部内容啦,如果觉得有帮助的话,请给小玄: