0
点赞
收藏
分享

微信扫一扫

位移运算<<、>>和>>>

高子歌 2021-09-24 阅读 125

一、前言

在任何语言中,乘/除的倍数计算,位移运算的效率都是最高的,如果看过《计算机组成原理》(大学课本),就应该知道;

  • ALU(算术逻辑单元)是负责做运算的;
  • 计算机只支持加法 or 减法;乘法 or 除法是不支持的;

因此,位移操作是直接在硬件中完成,无需软件辅助,或额外的硬件来协助!

二、Java中的位移

你可能见过:

  • 右移『>>』
  • 左移『<<』
    但你知道其实还有『>>>』么?(但没有『<<<』)

2.1、位移 >> 和 <<

这两个很常见,带符号右移(>>)和带符号左移(<<),移动之后的空位用『0』填充

public class Main {
    public static void main(String[] args) {
        int x = -4;
        print(x, 1, 1);
        print(x, 2, 1);
        print(x, 2, 2);
    }

    private static void print(int value, int offset, int num) {
        int x = value;
        String symbol = "";
        switch (offset) {
            case 2:
                x = x >> num;
                symbol = " >> ";
                break;
            default:
                break;
        }
        System.out.println(value + symbol + "= " + x + " (" + Integer.toBinaryString(x) + ")");
    }
}

// 输出结果
// -4    = -4 (11111111111111111111111111111100)
// -4 >> = -2 (11111111111111111111111111111110)
// -4 >> = -1 (11111111111111111111111111111111)

2.2、只有>>> ,没有<<<

既然上面说了是带符号的,那这里就是不带符号的,算术功能同上:
不带符号右移(>>>),没有不带符号的左移『<<<』,移动之后的空位用『0』填充

public class Main {
    public static void main(String[] args) {
        int x = -4;
        System.out.println("max = " + Integer.MAX_VALUE + " (" + Integer.toBinaryString(Integer.MAX_VALUE) + ")");
        print(x, 1, 1);
        print(x, 3, 1);
        print(x, 3, 2);
    }

    private static void print(int value, int offset, int num) {
        int x = value;
        String symbol = "";
        switch (offset) {
            case 3:
                x = x >>> num;
                symbol = " >>> ";
                break;
            default:
                break;
        }
        System.out.println(value + symbol + "= " + x + " (" + Integer.toBinaryString(x) + ")");
    }
}
// 输出结果
// max    = 2147483647 (01111111111111111111111111111111)
// -4     = -4         (11111111111111111111111111111100)
// -4 >>> = 2147483646 (01111111111111111111111111111110)
// -4 >>> = 1073741823 (00111111111111111111111111111111)
举报

相关推荐

0 条评论