#####写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
看到这个题目,首先可以想到十进制数模2可以得到它的二进制数,所以可以用循环,然后模2,就可以得到二进制数里面的1,然后定义一个计数器count,则可以判断1的个数.代码如下:
#include<stdio.h>
int main()
{
int num=15;
int count=0;
while(num)
{
if(num%2==1)
count++;
num = num/2;
}
printf("%d\n", count);
return 0;
}
但是当你运行时,你会发现这个代码也是有缺陷的,如果给num赋值一个负数,while循环将不能循环,所以可以采用下面的方法,直接用二进制进行运算,操作符的知识点梳理里面可以看到 一位二进制数按位与1则可以得到它的最低位。
然后发现num按位与(num-1)得到的结果是把它二进制数的最后一位去掉了,然后把按位与的值再赋给num,再与(num-1)按位与,直到num最后为0
.所以可以参考下面的代码,即用到了函数
#include<stdio.h>
int count_one_bit(unsigned int n)
{
int count = 0;
while(n)
{
if(n%2 == 1)
count++;
n=n/2;
}
while(n)
{
n = n&(n-1);
count++;
}
return count;
}
int main()
{
int num = -1;
int ret = count_one_bit(num);
printf("ret = %d\n", ret);
return 0;
}
#####获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
一个整型是4个字节,32个比特位,所以可以按奇偶数排列写两个循环来输出
输出时随着循环右移,然后 按位与 1 则可以得到序列了
#include<stdio.h>
int main()
{
int num=112323;
int i=0;
for(i=31;i>=1;i-=2)
{
printf("%d ",(num>>i)&1);
}
printf("\n");
for(i=30;i>=0;i-=2)
{
printf("%d ",(num>>i)&1);
}
system("pause");
return 0;
}
#####两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
因为要比较有多少个位不同,所以可以想到异或,相同为0,不同为1
然后异或出来的结果再用循环,数出 1 的位数
#include<stdio.h>
int main()
{
int m=1999;
int n=2299;
int count=0;
int i=m^n;
while(i!=0)
{
i=i&(i-1);
count++;
}
printf("%d",count);
system("pause");
return 0;
}