郓城县南赵楼镇邮编:计算无符号数中二进制1的个数 - C

来源:百度文库 编辑:九乡新闻网 时间:2024/04/18 10:59:46
原文地址:http://tyima.blogbus.com/index.html 给定一个32位的无符号数,计算其为1的比特数目。虽然我们可以通过循环32次逐个检查每一位,但是似乎下面的方法要更快捷些: unsigned int
ones32(register unsigned int v)
{
unsigned int const w = v - ((v >> 1) & 0x55555555); unsigned int const x = (w & 0x33333333) + ((w >> 2) & 0x33333333);
return (((x + (x >> 4) & 0xF0F0F0F) * 0x1010101) >> 24);
} 这段代码写得还是相当有水准的. 第一行把x按照2比特分组划分成16组,计算各组中值为1的比特数目; 第二行把x按照4比特分组划分成8组,计算各组中值为1的比特数目; 第三行把x按照8比特分组划分成4组,计算各组中值为1的比特数目,将各组的数累加到高八位上 位翻转 或许编程的朋友都曾经遇到过比特位的翻转,这儿有一段小程序或许能参考一下:) 其实思想很简单,先对各个比特位进行两两交换,然后二二交换,然后四四交换,然后八八交换,最后前后对换。 unsigned int
reverse(register unsigned int x)
{
register unsigned int y = 0x55555555;
x = (((x >> 1) & y) | ((x & y) << 1));
y = 0x33333333;
x = (((x >> 2) & y) | ((x & y) << 2));
y = 0x0f0f0f0f;
x = (((x >> 4) & y) | ((x & y) << 4));
y = 0x00ff00ff;
x = (((x >> 8) & y) | ((x & y) << 8));
return((x >> 16) | (x << 16));
}