(from:http://blog.csdn.net/nash_/article/details/8262185)
1.判断int型最大值
int getMaxInt(){
return (1<<31) - 1;//2147483647
//return ((unsigned int)-1) >> 1;//2147483647,在不知道int型占用几个字节的情况,return 1<<(sizeof(int) - 1) - 1也可以
}
2.判断奇偶
boolean isOddNumber(int n){
return (n & 1) == 1;
}
3.不用临时变量交换两个数
void swap(int *a,int *b){
(*a)^=(*b)^=(*a)^=(*b);
}
4.返回绝对值
int abs(int n){
return (n ^ (n >> 31)) - (n >> 31);
}
5.取最大数
int max(int a,int b){
return b&((a-b)>>31) | a&(~(a-b)>>31);
/*如果a>=b,(a-b)>>31为0,否则为-1*/
}
6.判断符号是否相同
boolean isSameSign(int x, int y){ //有0的情况例外
return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。
}
7.判断是否为2的n次幂
boolean isFactorialofTwo(int n){
return (n & (n - 1)) == 0;
/*如果是2的幂,n一定是100... n-1就是1111....
所以做与运算结果为0*/
}
8.对2的n次方取余
int quyu(int m,int n){//n为2的次方
return m & (n - 1);
/*如果是2的幂,n一定是100... n-1就是1111....
所以做与运算结果保留m在n范围的非0的位*/
}
9.取平均值
int getAverage(int x, int y){
return ((x^y) >> 1) + (x&y);
/*(x^y) >> 1得到x,y其中一个为1的位并除以2,
x&y得到x,y都为1的部分,加一起就是平均数了*/
}
10.
return (n >> (m-1)) & 1; //从低到高,取n的第m位
return n | (1<<(m-1)); //从低到高,将n的第m位置1
return n & ~(1<<(m-1)); //从低到高,将n的第m位置为0
11. 当n>0时返回1,n<0时返回-1,n=0时返回0
return !!n - (((unsigned)n>>31)<<1);
//n=0时,!!n = 0,((unsigned)n>>31)<<1 = 0,相减为0;n>0时,!!n = 1,(unsigned)n>>31 = 0, <<1后还是0,相减为1;n<0时,!!n = 1 (unsigned)n>>31 = 1,<<1之后等于2,相减为-1
12.
return -~n; //计算n+1
return ~-n; //计算n-1
return ~n+1; //取相反数
x = a^b^c; //if(x ==a) x = b; if(x == b) x = a;