- 写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1 程序原型: int count_one_bits(unsigned int value) { // 返回 1的位数 }
这道题有两种思路:
第一种思路是求模然后不断位移来判断二进制为1的个数,但是这个方法如果int前不加unsigned就没有办法求负数的二进制当中1的个数,因为在C语言中的右移是算术右移,右移完之后会在最高位补符号位,负数补的是1,导致循环不能结束变成死循环.
第二种思路:按位与运算.将所求数字跟1进行按位与,1与1得1,1与0得0,由此计算二进制中1的个数.
代码实现:
#include <stdio.h>
#include <stdlib.h>
//方法二:按位与操作计数
int BitOneCount(int num){//这种方法加不加unsigned都可以实现负数的
int count = 0;
for (int i = 0; i < 32; i++){//0-31,所以是i<32
if ((num&(1 << i) )!= 0){
++count;
}
}return count;
}
//方法一:求模,不断移位判断数字奇偶来确定二进制代码中1的个数
int count_one_bits(unsigned int value) {//这种方法不加unsigned无法求负数,负数的二进制截断后会被理解成一个很大的数
int count = 0;
while (value != 0){
if (value % 2 == 1){
++count;
}
value = value >> 1;// 或者num/=2,右位移1等于除以2
}
return count;
}
int main(){
int ret1 = count_one_bits(-15);
printf("ret=%d\n", ret1);
int ret2 = BitOneCount(-10);
printf("ret=%d\n", ret2);
system("pause");
return 0;
}
2.获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
思路:
设置两个循环分别判断每个奇数位和偶数位的二进制数,然后逐个打印
代码实现:
#include <stdlib.h>
#include <stdio.h>
void Function(int num){
int i = 0;
for (i = 31; i >= 1; i = i - 2){
printf("%d ",(num>>i) & 1);
}
printf("\n");
for (i = 30; i >= 0; i = i - 2){
printf("%d ", (num >> i) & 1);
}
}
int main(){
Function(10);
system("pause");
return 0;
}
- 输出一个整数的每一位。
思路:
递归实现,先将数字每一位除以10直到剩下最高位,递归返回时从最高位开始打印
代码实现:
#include<stdio.h>
#include <stdlib.h>
int Print(unsigned int num){
if (num > 9){
Print(num/10);
}
printf("%d ", num%10);
}
int main(){
Print(1234);
system("pause");
return 0;
}
4.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7
思路:
分别求出两个数的所有二进制位的值,逐位相与,相同位计数即可.
代码实现:
#include <stdio.h>
#include <stdlib.h>
void Function(int m, int n){
int i = 0;
int count = 0;
for (i =31; i >=0; i--){
if (((m >> i)&1) != ((n >> i)&1)){
count++;
}
}
printf("%d\n", count);
}
int main(){
Function(1999,2299);
system("pause");
return 0;
}