在“深入”中看到的位求和的牛X方法

        《深入理解计算机系统》P193练习3.49介绍了一种对二进制位求和的快速思路,本来这题是一道逆向工程的题目。

        通常我们对一个二进制数的所有位求和都是通过对一位位的累加来求得,这样如果需要对一个64位数据进行位求和就要进行64次循环。但这里我们并行地计算8单字节的和来对数据进行位求和。上代码:

long fun(unsigned long x)
{
	long val = 0;
	int i;
	for( i = 0; i < 8; i++ )
	{
		val += x & 0x0101010101010101L;
		x >>= 1;
	}
	val += ( val >> 32 );
	val += ( val >> 16 );
	val += ( val >> 8 );
	return val & 0xFF;
}


你可能感兴趣的:(fun)