1. 写一个函数返回参数二进制中 1 的个数,比如:13的二进制为0000 1011其中有3个1,该函数原型为: int count_one_bits(unsigned int value) // 返回 1的位数 。
(1)一开始写的时候,想到的方法是遍历value的每一位,让它的每一位与1,设置一个计数变量count,如果与1之后得到的结果还是1,那么就count++。那么如何让value的每一位与1呢?我们知道整形的二进制有32位,所以value中有32位要与1,于是我们设置一个for循环 for (i = 0;i < 32;i++),并且每循环一次就让value右移一位,直到32位均与1。
(2)但是考虑到这样的方式比较麻烦,所以改进了一下,用value&(value-1)的方式获取value二进制中1的个数,原理如下图所示,每循环一次count++,当value==0之后则跳出循环。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//int count_one_bits(unsigned int value)
//{
// int i = 0;
// int count = 0;
// for (i = 0;i < 32;i++)
// {
// if ((value & 1) == 1)
// {
// count++;
// }
// value = value >> 1;
// }
// return count;
//}
int count_one_bits(unsigned int value)
{
int count = 0;
while (value != 0)
{
count++;
value = value & (value - 1);
}
return count;
}
int main()
{
int ret = 0;
unsigned int value = 0;
scanf("%d", &value);
ret=count_one_bits(value);
printf("%d\n", ret);
system("pause");
return 0;
}
2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
(1)首先想到的方法是,先获取某个数n的二进制数,然后存放在数组之中,然后用下标对数组进行访问并打印出所存放的数。
(2)后来改进了一下,分别进行对奇数位和偶数位的遍历,每隔两位打印一次,与1之后为1则打印1,否则打印0.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//int main()
//{
// int i = 0;
// int n = 0;
// int a[32] = { 0 };
// printf("请输入一个数:> ");
// scanf("%d", &n);
//
// //将十进制转化为二进制,存放在数组里
// for (i = 31; i>0; i--)
// {
// a[i] = n % 2;
// n /= 2;
// }
//
// //打印数组中存放的二进制
// printf("二进制为:> ");
// for (i = 0; i < 32; i++)
// {
// printf("%d", a[i]);
// }
// printf("\n");
//
// //打印奇数位数字
// printf("奇数位为:> ");
// for (i = 1; i <= 31; i += 2)
// printf("%d", a[i]);
// printf("\n");
//
// //打印偶数位数字
// printf("偶数位为:> ");
// for (i = 0; i <= 30; i += 2)
// printf("%d", a[i]);
// printf("\n");
//
// system("pause");
// return 0;
//}
int main()
{
int n = 10;
int i = 0;
for (i = 31;i >= 1;i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
for (i = 30;i >= 0;i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
system("pause");
return 0;
}
3.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子: 1999 2299 输出例子:7
我们知道有一个运算符叫做异或即:^,两数异或后相同位为0,不同则为1,当我们想知道两个数中有多少个bit位不同,可以通过求两数异或之后的值,然后判断该值中有多少个1,就可以化作本篇第一题了。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int Print(int a, int b)
{
a = a ^ b;
return a;
}
int count_one_bits(int a)
{
int count = 0;
while (a)
{
count++;
a = a & (a - 1);
}
return count;
}
int main()
{
int a = 0;
int b = 0;
int ret1 = 0;
int ret2 = 0;
scanf("%d%d", &a, &b);
ret1 = Print(a, b);
ret2 = count_one_bits(ret1);
printf("%d\n", ret2);
system("pause");
return 0;
}