一、前言
在任何语言中,乘/除的倍数
计算,位移运算的效率都是最高的,如果看过《计算机组成原理》(大学课本),就应该知道;
- ALU(算术逻辑单元)是负责做运算的;
- 计算机只支持加法 or 减法;乘法 or 除法是不支持的;
那乘法 or 除法怎么计算得来?
- ALU是通过加法 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)
网友评论