好记性不如铅笔头

C && C++, 编程

一道有意思的面试题

最近遇到了一个小测验,很有意思,这里笔记下。
问题如下:计算一个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”的个数,代码也会更加精炼。

有意思吧~~

发表评论

1 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据