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

作者: 青叶小小 | 来源:发表于2021-01-02 00:27 被阅读0次

一、前言

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

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

那乘法 or 除法怎么计算得来?

  1. ALU是通过加法 or 减法,以及位移操作来完成的;
  2. 位移是在寄存器中直接完成;

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

二、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)

相关文章

  • Java中的位移运算

    在Java中,位移运算属于基本运算,符号是<<和>>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他...

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

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

  • 位移运算

    位移运算 无符号位移 >>> 无符号右移,无符号位运算用 0 补位 <<< 无符号左移 带符号位移 >> 带符号...

  • 位移运算

    /*======================================================*...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 运算符

    位移位运算 如 UIViewAutoresizingFlexibleHeight = 1 << 4, 1.左移运算...

  • java 三种运算符理解

    >> : 右移运算符;低位移出,符号位不变 << : 左移运算符;高位移出,符号位不变 >>> : 无符号右移; ...

  • 二进制位运算实战(1)-开发一个进制转换工具

    从这篇文章你将了解到什么?ArrayBuffer的作用左位移和右位移运算的使用按位与运算的使用 之前介绍了二进制相...

  • 位运算

    运算符含义&按位与|按位或^按位异或~取反<<左位移>>右位移 按位与运算符(&)按位与运算将两个运算分量的对应位...

  • java位运算

    位运算符主要有3个:有符号右位移>>,有符号左位移<<,无符号右位移>>>,位运算的操作的对象是二进制的位,通过位...

网友评论

    本文标题:位移运算<<、>>和>>>

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