对手相逢时,无
论对手多么强大,
明知不敌,也要亮出自己的剑!
读者:求函数返回值,输入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语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是 把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。
每个域有一个域 名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
有时候,正是那些意想不到之人,成就了无人能成之事。
——图灵
正文完