前言:一、二题为牛客网练习,都有题目链接。
一、两个整数二进制位不同个数
题目链接
输入两个整数,求两个整数二进制格式有多少个位不同
示例1
输入:
22 33
输出
5
解题思路:
1.当我们想判断两个整数二进制位不同个数时,可以把这两个整数进行 ^(按位异或)操作,不同的二进制为 1 ,相同则为0,这样我们只需计算 ^ 后1的个数。
2.将 ^ 后的结果与1进行 &(按位与)操作,如果得出的结果为 1 则说明有一个 1 ,此操作需要我们判断32次,所以需要一个循环,而每次 & 1 后需要进行右移操作,因为是循环32次所以我们不需要考虑右移后补进来的数。
当然在第二步时还有更好的办法这里我们先上代码
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
int ret = 0;
int count = 0;
scanf("%d %d", &a, &b);
ret = a ^ b; //不同则为1,相同为0
while (ret) {
ret = ret & (ret - 1);
count++;
}
printf("%d\n", count);
return 0;
}
所以以后我们可以使用ret = ret & (ret - 1)的方式对一个二进制1的个数进行计算。
二、输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
题目链接
示例1
输入
10
输出
2
说明
十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
示例2
输入
-1 输出
32
说明
负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1
解题思路:
在第一题最后,我们说过了计算如何计算二进制1的个数了这里就不再说了。
int NumberOf1(int n ) {
// write code here
int count = 0; //计数用的
while (n) {
n = n & (n - 1);
count++;
}
return count;
}
三、获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
解题思路:
#include <stdio.h>
void print(int n) {
int i = 0;
//打印奇数
for (i = 30; i >= 0; i -= 2) {
printf("%d",(n>>i) & 1); //这里n>>i后并没有改变n的值。
}
printf("\n");
//打印偶数
for (i = 31; i >= 1; i -= 2) {
printf("%d", (n>>i) & 1);
}
}
int main() {
int num = 0;
scanf("%d", &num);
print(num);
return 0;
}
好了今天关于二进制的练习就到这里了,我们下期再见