Java中的位运算

    在学习位运算之前,读者必须知道这些参与运算的长串0,1数字串是什么东西?这些串叫机器码,具体来说,是机器码中的一类:补码。关于机器码的介绍请参考《计算机基础之原码、反码和补码》一文。

    Java中的位运算可以分类两大类:移位运算和位逻辑运算。移位运算包括左移(<<)、右移(>>)和无符号右移(>>>)三种,位逻辑运算包括与(&)、或(|)、非(~)和异或(^)四种。下面详细介绍各种运算的运算规则,为了方面演示,下面定义4个演示数字。

十进制 补码
7 00000000 00000000 00000000 00000111
-7 11111111 11111111 11111111 11111001
3 00000000 00000000 00000000 00000011
-3 11111111 11111111 11111111 11111101

一、移位运算

    1、左移(<<):不论正数还是负数,一律在低位补0。

        7 << 3 => 00000000 00000000 00000000 00111000 => 56 = 7*(2*2*2)
        -7 << 3 => 11111111 11111111 11111111 11001000 => -56 = -7*(2*2*2)
       通过上面这个推倒公式,可以得出:一个数左移n位相当于该数乘以了2的n次方。   

    2、右移(>>):如果是正数,其符号位为0,所以在高位补0;如果是负数,其符号位为1,所以在高位补1.

        7 >> 3 => 00000000 00000000 00000000 00000000 => 0 = 7/(2*2*2)
        -7 >> 3 => 11111111 11111111 11111111 11111111 => -1 = Math.floor((float)-7/(2*2*2))
        上面的推倒公式,正数左移相当于整除运算;负数左移在整除之后在进行Math.floor运算。

    3、无符号右移(>>>):不论正数还是负数,高位一律补0,因为负数运算之后会变成正数。

        7 >>> 3 => 00000000 00000000 00000000 00000000 => 0 = 7/(2*2*2)
        -7 >>> 3 => 00011111 11111111 11111111 11111111 => 2^0 + 2^1 + ... + 2^28,这个数应该挺大的,呵呵!

二、位逻辑运算

    1、与(&):相同位均为1相加为1,否则为0。

    3&7=3
        00000000 00000000 00000000 00000011
        00000000 00000000 00000000 00000111
        00000000 00000000 00000000 00000011 
       -3&7=5
        11111111 11111111 11111111 11111101
        00000000 00000000 00000000 00000111
        00000000 00000000 00000000 00000101

    2、或(|):相同位均为0相加为0,否则为1。

    3|7=7
        00000000 00000000 00000000 00000011
        00000000 00000000 00000000 00000111
        00000000 00000000 00000000 00000111 
       -3|7=-1
        11111111 11111111 11111111 11111101
        00000000 00000000 00000000 00000111
        11111111 11111111 11111111 11111111

    3、非(~):又叫取反运算,所有位由0转为1,由1转为0。

      ~3=-4
          00000000 00000000 00000000 00000011
          11111111 11111111 11111111 11111100
       ~-3=2
          11111111 11111111 11111111 11111101
          00000000 00000000 00000000 00000010 
 

    4、异或(^):相同位值相等,则为0;否则为1。这个可以对比2个数字串中的相同位数,即异或值中0的个数。

        7^3=4
           00000000 00000000 00000000 00000111 
           00000000 00000000 00000000 00000011
           00000000 00000000 00000000 00000100
        ~7^3=-6
           11111111 11111111 11111111 11111001
           00000000 00000000 00000000 00000011
           11111111 11111111 11111111 11111010

    在java的开发过程中,可能会碰到数值类型转换的操作,如int转byte,long转int等,这是就需要用到位运算了;还有在设计缓存的时候,需要考虑内存占用,很多时候采用转存byte字节的方式,这是也需要使用位运算。位运算能提高程序执行效率,可以稍加掌握。

如有转载,请标明原文地址:http://my.oschina.net/xiaohui249/blog/173147

你可能感兴趣的:(java,位运算,无符号右移,机器码,左移,右移)