1.写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
返回 1的位数
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
////方法1
//int count_one_bits(unsigned int value)
//{
// int count = 0;
// while (value)
// {
// if (value % 2 == 1)
// {
// count++;
// }
// value = value / 2;
// }
// return count;
//}
////方法2
//int count_one_bits(unsigned int value)
//{
// int count = 0;
// int i = 0;
// for (i = 0; i < 32; i++)
// {
// if (((value >> i) & 1) == 1)//右移移 i 相当于除以 2^i
// count++;
// }
// return count;
//}
//这个方法要循环32次不够优化
//方法3
int count_one_bits(unsigned int value)
{
int count = 0;
while (value)
{
count++;
value = value & (value - 1);
}
return count;
}
int main()
{
int num = 0;
int ret = 0;
printf("input a number:\n");
scanf("%d", &num);
ret = count_one_bits(num);
printf("二进制中1的个数 = %d\n", ret);
system("pause");
return 0;
}
程序输出:
提示:对于移位运算符,不不要移动负数位,这个是标准未定义的。
2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int list(int n)
{
int i = 0;
int j = 0;
printf("输出奇数序列:");
for (i = 30; i >= 0; i -= 2)
{
j = (n >> i) & 1;
printf("%d", j);
}
printf("\n");
printf("输出偶数序列:");
for (i = 31; i >= 0; i -= 2)
{
j = (n >> i) & 1;
printf("%d", j);
}
printf("\n");
}
int main()
{
int num = 0;
int ret = 0;
printf("请输入一个数字:\n");
scanf("%d", &num);
ret = list(num);
printf("\n");
system("pause");
return 0;
}
程序输出:
3.两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子 :1999 2299 输出例子 : 7
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int count_one_bits(unsigned int value)
{
int count = 0;
while (value)
{
count++;
value = value & (value - 1);
}
return count;
}
int main()
{
int a = 0;
int b = 0;
int ret = 0;
printf("input two numbers: \n");
scanf("%d", &a, &b);
int num = a ^ b;
ret = count_one_bits(num);
printf("两数中不同位(bit)的个数 = %d\n", ret);
system("pause");
return 0;
}
程序输出: