位运算技巧

(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;










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值