1、
写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
// 返回 1的位数
}
2、获取一个数二进制序列中所有的偶数位和奇数位,
分别输出二进制序列。
3、输出一个整数的每一位。
4、编程实现:
两个int(32位)整数m和n的二进制表达中,
有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
1、 写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
// 返回 1的位数
}
#include<stdio.h>
#include<windows.h>
int Count_1_bits1(int x)
{
int count = 0;
while (x)
{ //模2取余
if (x % 2 == 1)
{
count++;
}
x /= 2;
}
return count;
}
int Count_1_bits2(int x)
{ //将目标数和1按位与&
int count = 0;
int i = 0;
while (i < sizeof(int)*8 - 1)//第一次按位与时左移0次,检测最高位时左移32次,所以这里 比特位-1
{
if (x & (1<<i)) //如果按位与为真,说明与1按位与的那一位数字也是1,count++
{
count++;
}
i++;
}
return count;
}
int Count_1_bits3(int x)
{ //面试题最佳答案,用自己本身x去按位与x-1
int count = 0;
while (x)
{
x = x & (x - 1);
count++;
}
return count;
}
int main()
{
int x = 0;
printf("输入一个数:");
scanf("%d",&x);
int result = Count_1_bits3(x);
printf("此数的二进制中有%d个1\n",result);
system("pause");
return 0;
}
2、获取一个数二进制序列中所有的偶数位和奇数位,
分别输出二进制序列。
//#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:4996) //这一句和上一句作用相同,解决scanf()函数maybe unsafe问题
#include<stdio.h>
#include<windows.h>
void Print_num(unsigned value)
{
int count=0;
int arr[32]={0};
int i=0;
while(value) //取出二进制序列的算法还可以优化
{
arr[i++]=value%2; //存在arr[]数组中的序列是倒着存进去的
value/=2;
count++;
}
printf("奇数序列:");
for(i=count;i>=0;i-=2) //倒着输出,i每次减2
{
printf("%d ",arr[i]);
}
printf("偶数序列:");
for(i=count-1;i>=0;i-=2)
{
printf("%d ",arr[i]);
}
}
int main()
{
int x=0;
printf("Please input a number:");
scanf("%d",&x);
Print_num(x);
system("pause");
return 0;
}
3、输出一个整数的每一位。
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
void print(unsigned value)
{
while(value)
{
printf("%d ",value%10); //输出的是倒序
value/=10;
}
//while(value) //代码有问题,怎么用递归输出?
//{
//if(value==1)
// return 1;
//else
//{
// value/=10;
// print(value);
//}
//}
}
int main()
{
int x=0;
printf("输入一个数:");
scanf("%d",&x);
print(x);
system("pause");
return 0;
}
4、编程实现:
两个int(32位)整数m和n的二进制表达中,
有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#include<stdio.h>
#include<windows.h>
int count(int value1,int value2) //面试题:求两个数的二进制位中有几个位不同
{
//按位异或^运算符,相同为1,不同为0
int m=value1^value2;//不一样的,要进行异或,异或之后会转变为另一个数字,
//这个数字表达的就是前两者中不一样的位数变为1了,比如
// 0000 0111
// ^ 0000 0100
//--------------
// 0000 0011
//这样问题就转化为求两数异或之后的数中1的个数了。
int num=0;
while(m>0)
{
m=m&(m-1); //求这个数的二进制序列中1的个数
num++;
}
return num;
}
int main()
{
int ret=count(1999,2299);
printf("这两个数的二进制位中有%d个位不同\n",ret);
system("pause");
return 0;
}