位运算

一、数据类型的位数

sizeof( byte ) == 8       
sizeof( boolean ) == 8      
sizeof( short ) == 16      
sizeof( int ) == 32       
sizeof( long ) == 64       
sizeof( float ) == 32       
sizeof( double ) == 64       
sizeof( char ) == 16

二、位运算符

<< 左移位,在低位处补0
>> 右移位,若为正数则高位补0,若为负数则高位补1
>>> 无符号右移位,无论正负都在高位补0
& 与(AND)
| 或(OR)
~ 非(NOT)//一元运算符
^ 异或(XOR)
<<= 左移位赋值
>>= 右移位赋值
>>>= 无符号右移位赋值
&= 按位与赋值
|= 按位或赋值
^= 按位异或赋值。

三、常用计算

  1. 判断int型变量a是奇数还是偶数
    a&1  == 0 //偶数      
    a&1 ==  1 //奇数
  2. 求平均值
    // 直接求(x + y) / 2,x+y可能超过int的最大范围 
    int x、y;
    int mid = (x&y)+((x^y)>>1);
  3. 对于一个大于0的整数,判断它是不是2的几次方
    ((x&(x-1))==0)&&(x!=0);
  4. 两个数字互换
    x ^= y;     
    y ^= x;     
    x ^= y;
  5. 求绝对值
     int abs( int x )    {      
         int y ;      
         y = x >> 31 ;     
         return (x^y)-y ;   
     }
    //或者
      (x+y)^y
  6. 取模运算
    //a % (2^n)
    a & (2^n - 1)
  7. 乘法运算
    //a * (2^n)
    a << n
  8. 除法运算
    //a / (2^n) 
    a>> n
  9. 求相反数
    (~x+1)
  10. 求a % 2
    a & 1

发表评论