1.M%N
当N=2^p,M%N = M & (N - 1);
2.计算数字N的二进制数字中1的个数
while( n != 0 )
{
n &= (n-1);
cnt++;
}【1】
cnt表示N的二进制表示中1的个数。n-1实际上在消n中的1,消了几次1就等于统计了n中有多少个1。
while( n != 0 )
{
if ( n & 1 == 1 )
cnt++;
n >>= 1;
}【2】
【1】式比【2】式的效率高
3.计算比M大且为N的倍数的最小整数(N=2^p)
K = (M + N - 1) & ~(N - 1)
4.常用一些技巧
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x