a>b ? a : b
int max(int a,int b){
return b & ((a-b) >> 31) | a & (~(a-b) >> 31);
/*如果a>=b,(a-b)>>31为0,否则为-1*/
}
对2的n次方取余
int quyu(int m,int n){//n为2的次方
return m & (n - 1);
/*如果是2的幂,n一定是100... n-1就是1111....
所以做与运算结果保留m在n范围的非0的位*/
}
以上 From http://blog.youkuaiyun.com/zmazon/article/details/8262185
取出最右侧的1
int quyu(int pos){
return pos & (~pos + 1);
}
以上 From 八皇后
求一个32位数中有几位非零位的运算
int Count32(unsigned long Arg) {
Arg = ((Arg >> 1) & 0x55555555) + (Arg & 0x55555555);
Arg = ((Arg >> 2) & 0x33333333) + (Arg & 0x33333333);
Arg = ((Arg >> 4) & 0x0f0f0f0f) + (Arg & 0x0f0f0f0f);
Arg = ((Arg >> 8) & 0x00ff00ff) + (Arg & 0x00ff00ff);
return (Arg >> 16) + (Arg & 0x0000ffff);
}
求最低位非零位是第几位的运算
int Lsb32(unsigned long Arg) {
int RetVal = 31;
if (Arg & 0x0000ffff) { RetVal -= 16; Arg &= 0x0000ffff; }
if (Arg & 0x00ff00ff) { RetVal -= 8; Arg &= 0x00ff00ff; }
if (Arg & 0x0f0f0f0f) { RetVal -= 4; Arg &= 0x0f0f0f0f; }
if (Arg & 0x33333333) { RetVal -= 2; Arg &= 0x33333333; }
if (Arg & 0x55555555) RetVal -=1;
return RetVal;
}
求最高位非零位是第几位的运算
int Msb32(unsigned long Arg) {
int RetVal = 0;
if (Arg & 0xffff0000) { RetVal += 16; Arg &= 0xffff0000; }
if (Arg & 0xff00ff00) { RetVal += 8; Arg &= 0xff00ff00; }
if (Arg & 0xf0f0f0f0) { RetVal += 4; Arg &= 0xf0f0f0f0; }
if (Arg & 0xcccccccc) { RetVal += 2; Arg &= 0xcccccccc; }
if (Arg & 0xaaaaaaaa) RetVal += 1;
return RetVal;
}