最近遇到了一个小测验,很有意思,这里笔记下。
问题如下:计算一个unsigned byte里面有多少个“1”。
第一想法是使用for循环,遍历8个位,简单代码如下:
int get1ofUnByte(unsigned char x) { int count = 0; int index = 0; for(index = 0; index < 8; ++index) { count += ( x & 0x1 ); x >>= 1; } return count; }
但是有没有更好的办法呢??如果后续需要计算1个unsigned int呢,循环32次?其实我们可以使用空间换时间的方法:
int get1ofUnByte(unsigned char x) { const static char numbers[16] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 }; return numbers[ x & 0xF ] + numbers[ (x>>4) & 0xF ]; }
由于1个unsigned byte可以有256个元素,使用数组保存会比较麻烦,但是我们可以保存半个字节,即1个F,这样就可以节省大量的空间了。
通过这种实现思路,在实际工作中我们可以通过代码宏的方式来快速的计算出unsigned byte,unsigned int中“1”的个数,代码也会更加精炼。
有意思吧~~
发表评论