查询二进制序列中1的个数

    xiaoxiao2022-07-12  137

    题目:求一整数存储在内存中的二进制中的1的个数

    下面是最常规的做法: 既然是二进制,那么不断对该数取模 即可 得到当前数对应的二进制最低位的值0/1,再除以2,相当于将该数减半,即二进制向左移动一个单位,进入下一循环…

    int count_one_bits(unsigned int value) //加上unsigned是为了防止如果输入的value是负值,将其二进制的符号位转化为数值位,以防陷入死循环 { int count = 0; while (value){ if (value % 2 == 1){ //取模判断最低位的值 count++; } value /= 2; //除运算,推进到下一数位 } return count; }

    那么,其中既然 value/=2 相当于二进制向右移动,那么,也可以引入移位操作符来实现:

    //在32为系统下,需判断32次 int count_one_bits(int value) //不用unsigned时,需要设置一个控制循环的变量(为了防止输入的value为一个负值,程序陷入死循环) { int count = 0; int c = 0; while (c < 32){ if (value & 1){ //二进制最低位与1按位与,实现判断最低位的功能(任何数与1相与为其本身) count++; } value >>= 1; //右移1位 c++; } return count; }

    此处,需要提及的是最低位判断部分 value & 1 ,举个例子就很轻易能够明白: 对于上面的代码还能进一步简化为:

    //每一次循环就会判断出来一个1 int count_one_bits(unsigned int value) { int count = 0; while (value){ count++; value &= (value - 1); } return count; }

    每一次循环就会找到一个1,计入计数器中!运行步骤如下: 如此,完美的实现了对二进制序列中1的位数的查询!显而易见,最后一种方法不好想,但是,同样比较完美!!!

    最后,附上完整代码:

    #include<stdio.h> #include<Windows.h> #pragma warning (disable:4996) /* int count_one_bits(unsigned int value) { int count = 0; while (value){ if (value % 2 == 1){ count++; } value /= 2; } return count; } */ /* //在32为系统下,需判断32次 int count_one_bits(int value) { int count = 0; int c = 0; while (c < 32){ if (value & 1){ count++; } value >>= 1; c++; } return count; } */ //每一次循环就会判断出来一个1 int count_one_bits(unsigned int value) { int count = 0; while (value){ count++; value &= (value - 1); } return count; } int main() { int number = 0; int count = 0; printf("请输入一个数用以计算其二进制中1的个数:"); scanf("%d", &number); count=count_one_bits(number); printf("%d", count); system("pause"); return 0; }

    ———————————————————————————————————————————

    THE END

    最新回复(0)