ss今天和大家分享一下求二进制数字1的个数的方法
1.先回顾一下^ & | 的规则方法
^ 在二进制下,一位与一位^的时候,相同的情况下(同时为零或者同时为一),它的结果就是1,不同的话就是零。
& 一位一位的&,得同时为1,(两个位置&)结果才是1,否则为0。
| 一位一位的|,两个位都为0时,结果才为0。
2.ss先介绍一下求正整数的,因为正整数的原码反码补码三者都是一样的,所以这种方法有局限性。
我们可以知道 二进制的第一位,是2的零次方乘以这个位上的数,其他的位置都是二的各种次方,所以其他位都是二的倍数,如果第一位为一的话,那么这个数%2一定有1,所以我们只要%2一次,右移一位即可,直到这个数为零,思路清晰,代码实操。
int main()
{
int a = 32527,count=0;
for (int i = 0; i < 32; i++)
{
if (a % 2 == 1)
{
count++;
}
a = a >> 1;
}
printf("%d", count);
return 0;
}
第二种方法和第三种方法都是正负数都使用
第二种 1的二进制第一位就是确定的1,所以我们要检查第一位是不是1,那我们直接&,是1 的话就为1,不是1的话则为零,然后再进行右移,知道为零。
int main()
{
int a = 32527,count=0;
for (int i = 0; i < 32; i++)
{
if ((a & 1)== 1)
{
count++;
}
a = a >> 1;
}
printf("%d", count);
return 0;
}
为什么再if的括号里面加一个括号呢,因为&与==的优先级
第三种:我们可以知道,减一就会把二进制的第一位改变成相反的(0->1或者1->0),然年后其他位置的一就会移动位置,但是数字1的个数并没有变化,ss就不实际操作了,大家可以举个数字试试,每次&就会减掉一个1,所以我们只要每次把最后一位减一,两个值进行&,得到的结果就可以计算了,
int main()
{
int a = 32527,count=0;
while (a)
{
a &= a - 1;
count++;
}
printf("%d", count);
return 0;
}