位运算||异或运算||移位运算 JAVA

不计进位的和是a^b,进位和是a&b   a+b=a^b+(a&b)<<1


1、位运算

Java中有4个位运算,他们的运算规则如下:

(1)按位与(&):两位全为1,结果为1;否则为0;

(2)按位或( | ):两位全为0,结果为0;否则为1;

(3)按位取反( ~ ):0变1,1变0;

(4)按位异或( ^ ):两位,如果相同,结果为0;如果不同,结果为1

注意:

(1)位运算中的 符号位(最高位) 也跟着变;

(2)位运算符与逻辑运算符(逻辑与&&、逻辑或||、逻辑非!)相似,但是,逻辑运算符只能操作Boolean变量【即其两边都是Boolean值】


2、位运算应用

(1)~5=?

        >>>>>5的补码:00000000 00000000 00000000 00000101

        >>>>>> ~5    :11111111 11111111 11111111 11111010

                        注意:因为高位数是1(负数),所以要将该补码转换为原码;

                                  如果高位数是0(整数),就不需要将补码转为原码,

                                        因为正数的原码、反码、补码都一样。

           >>>>> 该负数的补码转为反码:11111111 1111111 1111111 11111001

            >>>>>该负数的反码转为原码:10000000 00000000 00000000 00000110

            >>>>>将二进制原码转换为十进制:0 * 2^0 + 1 * 2^1 + 1 * 2^2 = 0+2+4 = -6 (最高位为1,所以为负数


3、移位运算

Java中有三个移位运算符

(1)算术右移(>>):低位溢出,符号位不变,并用符号位补溢出的高位;

        右移规则:符号位不变,左边补上符号位![正数补0,负数补1]

        右移一位相当于除2,右移n位相当于除以2的n次方。

     11 >>2(11为int型)
      1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011
      2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。
      3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010。
         转换为十进制是3。

(2)算法左移(<<):符号位不变,低位补0;

        左移规则:丢弃最高位,0补最低位!

        在没有数字溢出的情况下,对于正数和负数,左移n位都相当于乘以2的n次方。

    例如:3 <<2(3为int型)
    1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,
    2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
    3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,
       转换为十进制是12。

(3)逻辑右移(>>>):低位溢出,高位补0;【注意:逻辑右移中的 符号位(最高位)也跟着变

        无符号右移运算符>>>只是对32位和64位的值有意义。


切记!切记!切记!位运算与移位运算,

都是使用的二进制的补码进行操作的!!!










猜你喜欢

转载自blog.csdn.net/u014067137/article/details/80049123
今日推荐