提示:在32位机器下,一个整数的二进制是32位;在64位机器下,一个整数的二进制是64位.本文统一采用32位机器计数方法。
文章目录
前言
在计算机中存储数据/信息/代码,是以二进制方式存储,所以我们为了更加了解计算机的运行方式,需要去了解一下关于计算二进制位中的1和0的个数的方法。
本文是关于C语言中计算整数二进制位中的1的个数的三个方法。
一、关于一个整数的二进制表示方法
整数包括:正整数、负整数、零。
在二进制表示中,正整数和零的原码,反码,补码是一致的;负整数的原码,反码,补码表示方法各不一样。
负整数的原码:将最高位取1,其他位按二进制方法取0和1;
反码:将原码的符号位(最高位)不变,其他位按位取反(原本是1的取0,原本是0的取1);
补码:在反码的基础上,进行加1,即可得到补码。
二、计算二进制中的1的方法
1.取余法
注意:本方法只能争对非负整数
将一个非负整数进行转变为计算机中存储的二进制,本质上就是对该非负整数,不断地对2整除和取余.
例:将10的二进制中的1的个数求出:
代码:
#include<stdio.h> int main() { int a = 10; int count = 0;//二进制1的个数存储 while (a) { //二进制里最后面那个数是1 if (a % 2 != 0) { count++; } a /= 2; } printf("%d\n", count); return 0; }
输出:
2
结果分析:
10的二进制原码: 00000000000000000000000000001010
其中1的个数为2。
2.移位法
在C语言中,右移运算符(按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1)可以帮助我们完成计算二进制中的1的个数。
方法:先将一个整数进行与1按位与(&),判断结果为1还是0,如果是1则该二进制中1的个数加1,再右移1位;再将其进行按位与1,判断结果为1还是0,右移1位……直到该整数等于0或者已经循环判断32次。
例:将-1的二进制中的1的个数求出:
代码:
#include<stdio.h> int main() { int a = -1; int count = 0; int i = 32; while (a&&i) { if ((a & 1) == 1) { count++; } a >>= 1; i--; } printf("%d\n", count); return 0; }
输出:
32
结果分析:
-1在计算机中的存储方式为反码,它的反码是:11111111111111111111111111111111
其中1的个数为32。
3.高级计算法
例:将11的二进制中的1的个数求出:
代码:
#include<stdio.h> int main() { int a = 11; int count = 0; while (a) { count++; a &= (a - 1); } printf("%d\n", count); return 0; }
输出结果:
3
结果分析:
11的二进制原码:00000000000000000000000000001011
其中1的个数为3
总结
以上就是今天的内容,本文仅仅简单介绍了 的三种方法,而第三种方法能使我们快速便捷地处理数据的二进制中的1的个数。
这篇博客如果对你有帮助,给博主一个免费的点赞以示鼓励,欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言哦。