32位int整型数的二进制表示中1的个数
来源:互联网 发布:国税数据质量整改 编辑:程序博客网 时间:2024/05/16 15:20
前段时间遇到这个题,现在记录几个实现方法。
1,第一个最直观的方法,用一个二进制表示只有1个1的数字去测试整型数的各个位置是否为1:,直接上代码:
int bit_count_1(int num){ int flag = 0x1; int count = 0; for (int i = 0; i < 32; ++i) { if (0 != (num & flag)) { ++count; } flag = flag << 1; } return count;}
2,第二个方法,注意到一个整型数n,与n-1相与,其结果将是n的为1的最低位变为0,利用这个特点,可以有算法为:每次判断n是否为0,不为0则说明n中至少有1个1,随后将n=n&(n-1),这样可以去掉n中最低位的那个1,然后继续循环。代码很简单,如下:
int bit_count_2(int num){ int count = 0; while (0 != num) { ++count; num = num & (num - 1); } return count;}
3,第三个方法,可以先设置一个数组,第n个元素的值就是n的二进制表示中1的个数,假设有记录所有4bit整数的这样一个数组,则对于32位整型数,则将该32位整数分为8块,统计各块的1的个数之和即得到完整的32位整型数中的1的个数,具体的看代码就 清楚了:
int bit_num[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};int bit_count_3(int num){ return (bit_num[num & 0xf] + bit_num[(num >> 4) & 0xf] + bit_num[(num >> 8) & 0xf] + bit_num[(num >> 12) & 0xf] + bit_num[(num >> 16) & 0xf] + bit_num[(num >> 20) & 0xf] + bit_num[(num >> 24) & 0xf] + bit_num[(num >> 28) & 0xf]);}
还有许多其他算法,再次先不研究了~
0 0
- 32位int整型数的二进制表示中1的个数
- 整型数其二进制表示中”1“的个数
- 无符号整型数用二进制串表示,求此串中1的个数
- 求整型数的二进制表示中1的个数。简单题目中蕴藏着人生真谛啊
- C语言位运算应用一:求一个数的二进制表示中1的个数
- 统计数x的二进制表示中1的个数
- 求一个数的二进制表示中1的个数
- 求一个数的二进制表示中1的个数
- 统计一个数的二进制表示中1的个数
- 计算一个数的二进制表示中1的个数
- 【位操作】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
- 求一个数二进制表示中1的个数
- 数数字二进制表示中1的个数
- 统计一个数二进制表示中1的个数
- 输出该数二进制表示中1的个数
- 计算整型数二进制中值为1的位的个数
- 一个unsign int 数中二进制1的个数
- int型整数二进制数中1的个数
- Java Web 经典开发模式
- 隐马尔科夫学习五(一)
- hunnu--11550--欧拉函数
- Swing高级JProgressBarTest进度条
- MySQL执行外部sql脚本文件的命令
- 32位int整型数的二进制表示中1的个数
- 了解URL编码的基本概念,在javascript和java程序中使用内置的API进行编码和解码
- 欢迎使用CSDN-markdown编辑器
- Yii2设置别名函数(setAlias)和获取别名函数(getAlias)
- android应用开发全程实录-你有多熟悉listview? getView重写 inflate结合各种Adapter实例
- C++操作符重载
- XSS攻击及其解决方案
- 动手写一个HTML5的无限循环滚动焦点图
- android从零开始(五)读取网络图片