经验分享 – 基础知识 | 每日一面(1)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:求函数返回值,输入x=9999;

int func ( x ) 
{
    int countx = 0; 
    while ( x ) { 
    countx ++;
    x = x&(x-1); 
}
 return countx; 
} 

小林:

这是统计9999的二进制数值中有多少个1的函数,且有

9999=9×1024+512+256+15

9×1024中含有1的个数为2;

512中含有1的个数为1;

256中含有1的个数为1;

15中含有1的个数为4;

故共有1的个数为8,结果为8。

1000 – 1 = 0111,正好是原数取反。这就是原理。用这种方法来求1的个数是很效率很高的。不必去一个一个地移位。循环次数最少。

读者:什么是位域 ?

小林:

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。

例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。

所谓“位域”是 把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。

每个域有一个域 名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完