int型数值占内存4个字节,就是4 * 8 = 32个字符。如果二进制每一位上都判断是否为1的话,最多需要32次来判断。
还有两个比较重要的符号需要了解:
(1)& 位运算符
是把两个不同操作数内相同位置的位关联起来的AND(和),相同位置的值都是1则运算结果该位还是1,一旦有一个是0或两个都是0,则位运算的结果该位都是0。
(2)>> << 移位运算符
移位运算符将左操作数的二进制向左/右移动数个位置,至于移动几个位置,由右操作数指定。移位数值与移动位数都要求是整数。
>> 向右移位 | a>>b ,a数值的每个位向右移动b个位 |
---|---|
<< 向左移位 | a>>b ,a数值的每个位向左移动b个位 |
两种运算举例:
int a =7 | 0x00000111 |
---|---|
int b =1 | 0x00000001 |
a & b | 0x00000001 |
a>>b | 0x00000011 |
a<<b | 0x00001110 |
上面实例中可以看出,a&b的结果就是0x00000001,十进制就是1。根据这个原理,二进制数值有多少个1,就可以将每一位移位到低位,然后分别与0x00000001进行位运算,位运算结果是1,则二进制就是1,反之是0;移位运算中,向左移位后面补0,向右移位则前面补0。
有了以上的基础就可以求int型数值二进制中1的个数了。
#include<stdio.h>
int main()
{
int a = 0xf;//0xf的二进制是1111,尝试用代码来数出有多少个1
int count = 0;//统计1的个数
int i = 0;//while循环次数
while(i < 32)//i用来限制while的循环次数,最多有32次需要判断是否为1,又因为i = 0,所以i<32
{
if (a & 0x01)//位运算符,如果为真,即为1,则count加1
{
count ++;
}
a = a >> 1;//移位
i++;
}
printf("%d\n",count);
}
执行结果: