计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。
代码:
#pragma once
#include<stdio.h>
#include<stdlib.h>
//计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。
//32位,0 --00000000 00000000 00000000 00000000
// 1---00000000 00000000 00000000 00000001
// -1 --10000000 00000000 00000000 00000001---原码
// 11111111 11111111 11111111 11111110---反码
// -1 --11111111 11111111 11111111 11111111---补码
// 最高位是符号位,不发生变化
// 计算机存储整型数据以补码的形式
// 正确解---与&运算 --补码按位与
int count_one_bits(int num)
{
int count = 0;
while (num)
{
count++;
num = num & (num - 1);
}
return count;
}
// 不移数字,只移比较的1
int count_one_bits1(int num)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (num & flag)
count++;
flag = flag << 1;
}
return count;
}
int main()
{
int num = 3;
int ret = count_one_bits1(num);
printf("%d\n", ret);
system("pause");
return 0;
}