美文网首页
[Java] 移位运算1

[Java] 移位运算1

作者: 灰灰手记 | 来源:发表于2017-05-08 22:20 被阅读197次
    java中有三种移位运算符
    操作符 说明 举例
    << 左移运算符 num << 1,相当于 num 乘以 2
    >> 右移运算符 num >> 1,相当于 num 除以 2
    >>> 无符号右移 忽略符号位,空位都以 0 补齐

    为什么没有 无符号左移 ( <<< ) ?
    因为左移是在后面补 0,而右移是在前面边补 1 或 0 ;
    有无符号是取决于数的前面的第一位是 0 还 是1 ,
    所以右移是会产生到底补 1 还是 0 的问题。
    而左移始终是在右边补,不会产生符号问题。
    所以无符号左移 <<< 和左移 << 是一样的概念,没有必要额外的无符号左移 <<<。

    移位运算4个字总结就是“左乘右除”

    但并不是说一定是乘除,只是给出一种快速记忆的方法,具体结果怎样,还要看具体运算。如下面的例子。


    1、左移:<<

    例 1.1:2 << 2

    操作数:2 移位:2
    二进制 0010
    左移 2 位 1000
    运算结果 8
    相当于

    例 1.2:-2 << 2

    操作数:-2 移位:2
    原码(正 2 的二进制) 0000....0010
    反码(原码按位取反) 1111....1101
    补码(反码符号位不变,末位 + 1) 1111....1110
    左移 2 位 1111....1000
    符号位固定,其他位取反 1000....0111
    符号位固定,最低位 +1 1000....1000
    运算结果 -8
    相当于

    例 1.3:3 << 2

    操作数:3 移位:2
    二进制 0011
    左移 2 位 1100
    运算结果 12
    相当于

    小结:
    移位运算 num << n 相当于


    2、右移:>>

    例 2.1:4 >> 2

    操作数:4 移位:2
    二进制 0100
    右移 2 位 0001
    运算结果 1
    相当于

    例 2.2:-4 >> 2

    操作数:-4 移位:2
    原码(正 4 的二进制) 0000....0100
    反码(原码按位取反) 1111....1011
    补码(反码符号位不变,末位 + 1) 1111....1100
    右移 2 位 1111....1111
    符号位固定,其他位取反 1000....0000
    符号位固定,末位 +1 1000....0001
    运算结果 -1
    相当于

    例 2.3:7 >> 2

    操作数:7 移位:2
    二进制 0111
    右移 2 位 0001
    运算结果 1
    相当于 显然结果不是

    例 2.3:-7 >> 2

    操作数:-7 移位:2
    原码(正 7 的二进制) 0000....0111
    反码(原码按位取反) 1111....1000
    补码(反码符号位不变,末位 + 1) 1111....1001
    右移 2 位 1111....1110
    符号位固定,其他位取反 1000....0001
    符号位固定,末位 +1 1000....0010
    运算结果 -2
    相当于 显然结果不是

    这里就解释了上面一直说“相当于”的问题,因为移位运算是操作的二进制位,恰巧看起来像乘除

    而已。

    小结:
    移位运算 num >> n 相当于

    ,但并不是等于

    3、无符号右移:>>>

    例 3.1:8 >>> 2

    操作数:8 移位:2
    二进制 0000....1000
    右移 2 位 0000....0010
    运算结果 1
    相当于

    例 3.2:7 >>> 2

    操作数:7 移位:2
    二进制 0000....0111
    带符号位右移 2 位 0000....0001
    运算结果 1
    相当于 显然结果不是

    例 3.2:-8 >>> 2

    操作数:-8 移位:2
    原码(正 8 的二进制) 0000....1000
    反码(原码按位取反) 1111....0111
    补码(反码符号位不变,末位 + 1) 1111....1000
    带符号位右移 2 位 0011....1110
    运算结果 1073741822
    相当于 显然结果不是

    小结:
    当操作数是正数,那么 >>、>>> 都是一样的,相当于但不等于


    当操作数是负数,那么 >>、>>> 的结果将出现很大差异,而且 >>> 的结果一般都会变为正数。
    因此要慎重使用 >>> 运算

    [Java] 移位运算2,你可能不知道的运算

    相关文章

      网友评论

          本文标题:[Java] 移位运算1

          本文链接:https://www.haomeiwen.com/subject/kkcugttx.html