欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

别被误导了,这才是java中的真正的逻辑移位和算数移位

程序员文章站 2022-06-03 11:57:33
...

在计算机中,正数和负数都采用补码表示,以下的移位规则,适用于补码,无溢出的情况。如果移位使得符号位发生变化,则发生溢出。

逻辑移位

不考虑数的正负性,符号位会跟着一起移位。

  • 逻辑左移,高位移丢,低位补0
  • 逻辑右移,低位移丢,高位补0

算数移位:

考虑数的正负性,符号位不会跟着一起移位。
正数:

  • 算数左移,高位移丢,低位补0
  • 算数右移,低位移丢,高位补0

负数:

  • 算数左移,高位移丢,低位补0
  • 算数右移,低位移丢,高位补1

从上面这些规则可以看出:

  • 逻辑左移和算数左移的规则相同,都是低位补0,所以在java中,算数左移和逻辑左移采用 <<
  • 对于负数,逻辑右移和算数右移的规则不一样,所以在java中,逻辑右移采用>>>表示,算数右移采用>>表示

有什么用?

  • 对于算数移位,不论数的正负性,算数右移1位就是将数缩小一倍,算数左移一位就是将数扩大一倍。
  • 对于逻辑移位,正数的逻辑左移,扩大一倍,正数的逻辑右移,缩小一倍。负数的逻辑左移,扩大一倍,负数的逻辑右移,不确定。

放到java中

  • >>将数缩小一倍,<<将数扩大一倍,
  • >>>将正数缩小一倍,负数不确定。

1. 验证逻辑移位,符号位会跟着移动,而算数移位不会。

class Solution {
    public static void main(String[] args) {
        int a = -128;
        print(a);
        print(a>>>1);
        print(a>>1);

    }
    private static void print(int a){
        System.out.println(a);
        System.out.print(" 二进制形式为:");
        for (int i = 31; i >= 0; i--) {
            if ((i + 1) % 4 == 0) {
                System.out.print(" ");
            }
            System.out.print(a >> i & 1);
        }
        System.out.println();
    }
}

结果如下:
别被误导了,这才是java中的真正的逻辑移位和算数移位

相关标签: java 补码