JAVA语法--位运算

  位运算符有:<< , >> , >>> , & , | , ^ , ~

  下面通过实验来学习这几种运算

  以下的数据类型是 int 用32位表示,二进制右边的0省略

  // 21和-21的二进制表示

  System.out.println( Integer.toBinaryString(21));  // 10101


      System.out.println(Integer.toBinaryString(-21)); // 11111111111111111111111111101011

  

  // << 带符号位向右移 移动n位即乘以2的n次方(输出结果为下面注释)

  System.out.println("21 << 4 : " + Integer.toBinaryString(21 << 4) + " to decimate: " + (21 << 4));

   // 21 << 4 : 101010000 to decimate: 336

  System.out.println("-21 << 4 : " + Integer.toBinaryString(-21 << 4) + " to decimate: " + (-21 << 4));

  // -21 << 4 : 11111111111111111111111010110000 to decimate: -336

 

  // >> 带符号位向左移 高位补符号位 移动n位即除以2的n次方(输出结果为下面注释)

  System.out.println("21 >> 3 : " + Integer.toBinaryString(21 >> 3)+ " to decimate: " + (21 >> 3));

  // 21 >> 3 : 10 to decimate: 2

  System.out.println("-21 >> 3 : " + Integer.toBinaryString(-21 >> 3)+ " to decimate: " +(-21 >> 3));

  // -21 >> 3 : 11111111111111111111111111111101 to decimate: -3

 

  // >>> 不带符号位左移 高位补0

  System.out.println("21 >>> 3 : " + Integer.toBinaryString(21 >>> 3) + " to decimate: " + (21 >>> 3));

  // 21 >>> 3 : 11111111111111111111111111101011 to decimate: 2

  System.out.println("-21 >>> 3 : " + Integer.toBinaryString(-21 >>> 3)+ " to decimate: " + (-21 >>> 3));

  // -21 >>> 3 : 11111111111111111111111111101 to decimate: 536870909

  System.out.println(Integer.parseInt("11111111111111111111111111101", 2)); // 转为十进制

  // 536870909

 

  // & 第一个操作数的第n位 与 第二个操作数的第n位 相同为1时为1  其他情况为 0

  System.out.println(4 & 1); // 100 & 1 = 0

  System.out.println(5 & 1); // 101 & 1 = 1

  System.out.println(5 & 3); // 101 & 11 = 1

 

  // | 第一个操作数的第n位 或 第二个操作数的第n位 其中一个为1就为1

  System.out.println(5 & 2); // 101 & 10 = 111 = 7

 

  // ^ 第一个操作数的第n位 异或 第二个操作数的第n位 相同为1  不同为0

  System.out.println(5 ^ 3); // 101 ^ 11 = 110 = 6

  

  // ~ 操作数的第n位为1,那么结果的第n位为0,反之。

  System.out.println(~5); // ~00101 = 11010 = -6

 

  (转~)应用:

  1.  判断int型变量a是奇数还是偶数    
       a&1  = 0 偶数 
       a&1 =  1 奇数 
  2.  求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
        (x&y)+((x^y)>>1); 
  3.  对于一个大于0的整数,判断它是不是2的几次方
      ((x&(x-1))==0)&&(x!=0); 
  4.  比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
        x ^= y; 
        y ^= x; 
        x ^= y; 
  5. 求绝对值
      int abs( int x ){ 
         int y ; 
         y = x >> 31 ; 
       return (x^y)-y ;        //or: (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

 

posted @ 2015-12-16 14:57  Kirov  阅读(203)  评论(0编辑  收藏  举报