技术随笔:计算某char变量bit位为1的总数目
2011-12-16 11:17
316 查看
通过移位实现:
移位思想:
01010101 即为0X55
00110011 即为0X33
00001111 即为0X0F
首先 char是8Bit 那么通过
x = (x & 0x55) + ((x>>1) & 0x55);
这个运算加号左边计算0 2 4 6位是否为1 并且屏蔽1 3 5 7 位
加号右边计算1 3 5 7位是否为1 屏蔽 2 4 6位 丢弃0位 且char应该是unsign类型,右移即为逻辑右移高位补零不影响结果(1的数目)
这样就将这个char两位两位的分组(76,54,32,10) 每组1的个数分别保存在这些组中
x = (x & 0x33) + ((x>>2) & 0x33);
这个运算仿上进行,分组为(7654,3210) 并且将1的个数放在654,210位
最后也是一样了,放到最低4位里面 然后输出结果
其实中间有些位并没有用到.比如 第二步中的7和3位以及第三步的7654位
另一方法:
实现思想:
屏蔽除0位以外的位与1作与运算,若为1 则可知此位为1.sum的累加和即为1的个数.
#include <stdio.h> size_t func( char x ) { x = (x & 0x55) + ((x>>1) & 0x55);
x = (x & 0x33) + ((x>>2) & 0x33);
x = (x & 0x0f) + ((x>>4) & 0x0f);
return x; } int main() { printf("%d", func('c')); }
移位思想:
01010101 即为0X55
00110011 即为0X33
00001111 即为0X0F
首先 char是8Bit 那么通过
x = (x & 0x55) + ((x>>1) & 0x55);
这个运算加号左边计算0 2 4 6位是否为1 并且屏蔽1 3 5 7 位
加号右边计算1 3 5 7位是否为1 屏蔽 2 4 6位 丢弃0位 且char应该是unsign类型,右移即为逻辑右移高位补零不影响结果(1的数目)
这样就将这个char两位两位的分组(76,54,32,10) 每组1的个数分别保存在这些组中
x = (x & 0x33) + ((x>>2) & 0x33);
这个运算仿上进行,分组为(7654,3210) 并且将1的个数放在654,210位
最后也是一样了,放到最低4位里面 然后输出结果
其实中间有些位并没有用到.比如 第二步中的7和3位以及第三步的7654位
另一方法:
#include <stdio.h> BitCount(char a)
{ int i,sum=0;
for(i=0;i<8;i++)
sum+=a>>i&1;
return sum; } void main() { printf("%d \n",BitCount('a')); }
实现思想:
屏蔽除0位以外的位与1作与运算,若为1 则可知此位为1.sum的累加和即为1的个数.
相关文章推荐
- 如何计算某char变量bit位为1的总数目?
- 如何计算某char变量bit位为1的总数目?
- 计算char,short,int,long类型变量的取值范围
- 分布计算系统学习随笔 第七章分布式系统中容错技术
- 计算char,short,int,long类型变量的取值范围
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 云计算-从基础到应用架构系列-虚拟化的技术(上)
- 云计算的云数据安全与加密技术
- 计算变量size的讲解
- 云计算8项核心技术全解读
- 【 随笔 】 为什么要写技术文章
- .NET4.0并行计算技术基础(7)
- 用OpenCV编程计算围棋棋盘黑白子总数
- 计算广告学习笔记 5.2 搜索广告与demand技术 搜索广告
- 作业题,编写两个类:A和B,A创建的对象可以计算两个正整数的最大公约数,B创建的对象可以计算两个数的最小公倍数,要求:B类中有一个成员变量是A类声明的对象
- 一起谈.NET技术,asp.net页面中输出变量、Eval数据绑定等总结
- 云计算,不仅仅是数据的存储计算,更应该是数据的分析、挖掘计算- 电饭锅产业技术路线图发布:明晰发展方向
- .NET4.0并行计算技术基础(9) 推荐
- 计算文件夹下文件行总数的一个小demo