1、统计一个无符号整数的二进制表示中1的个数,函数原型是int countbit(unsigned int x);
。
/*Count the number of 1-bits in a positive number. **By LYLtim */ int CountBit(unsigned x) { x = (x & 0x55555555) + ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); x = (x & 0x0000FFFF) + ((x >> 16) & 0x0000FFFF); return x; }
巧妙地运用分治思想,详见:http://www.cnblogs.com/LYLtim/archive/2011/11/05/2236816.html
2、用位操作实现无符号整数的乘法运算,函数原型是unsigned int multiply(unsigned int x, unsigned int y);
。例如:(11011)2×(10010)2=((11011)2<<1)+((11011)2<<4)。
//By LYLtim unsigned multiply (unsigned x, unsigned y) { unsigned sum = 0, bit = 0; while (y != 0) { if (y & 1 == 1) sum += x << bit; y >>= 1; bit += 1; } return sum; }
3、对一个32位无符号整数做循环右移,函数原型是unsigned int rotate_right(unsigned int x, int n);
。所谓循环右移就是把低位移出去的部分再补到高位上去,例如rotate_right(0xdeadbeef, 8)
的值应该是0xefdeadbe。
// By LYLtim unsigned rotate_right(unsigned x, unsigned n) { unsigned tmp = x & ((1 << n) - 1); x >>= n; x += tmp << (32 - n); return x; }