Java中的位移操作详解

Java中的位移操作是指对二进制位进行移位的操作,包括左移(<<)、右移(>>)和无符号右移(>>>)三种。

左移操作将二进制数的每一位向左移动指定的位数,左移操作符是“<<”,移动时在右边补0。

右移操作将二进制数的每一位向右移动指定的位数,右移操作符是“>>”,移动时分为有符号和无符号两种,有符号时在左边补符号位(正数补0,负数补1),无符号时在左边补0。

无符号右移操作将二进制数的每一位向右移动指定的位数,无符号右移操作符是“>>>”,移动时在左边补0。

下面是一些位移操作的示例:

int a = 0b1010;  // a的二进制表示为1010
int b = a << 2;  // 将a左移2位,结果为101000,十进制表示为40
int c = a >> 1;  // 将a右移1位,结果为101,十进制表示为5
int d = a >>> 1; // 将a无符号右移1位,结果为0101,十进制表示为5

位移操作常用于位运算和优化代码。

Java 位移 左移(<<)

在 Java 中,位移操作是指按照指定的位数将二进制位向左或向右移动,并用 0 补充新出现的位置。其中,左移操作(<<)是指将二进制位向左移动指定的位数,右边用 0 填充。每一次左移都相当于乘以 2 的移动次幂次方。

以下是一个示例代码:

int num = 10;  // 10 的二进制表示为 1010
int shifted = num << 2; // 左移 2 位,相当于乘以 2 的 2 次幂(即 4)
System.out.println(shifted);  // 输出结果为 40,即 101000

在上面的示例中,变量 num 存储了整数值 10,其二进制表示为 1010。shifted 变量通过将 num 左移 2 位得到,相当于将 num 乘以 2 的 2 次幂,即 shifted 的值为 40,其二进制表示为 101000。

左移操作在处理位运算时非常常用,可以快速计算 2 的移动次幂次方,或者将一个整数乘以 2 的任意次幂。

Java 位移 右移(>>)

Java 中的位移操作包括左移(<<)、有符号右移(>>)和无符号右移(>>>),其中左移和右移操作是对二进制数进行操作。

右移(>>)操作会将指定数的二进制数按照指定的位数向右移动,移动后左边空出来的位用符号位(最高位)填充。

举个例子,对于十进制数 10(即二进制数 1010),如果将其右移 2 位,那么操作后得到的结果是 0010,即十进制数 2。

以下是一个示例代码,演示了右移操作的使用:

int num1 = 10;    // 十进制数 10,即二进制数 1010
int num2 = num1 >> 2;   // 将 num1 右移 2 位,得到 num2 = 2
System.out.println(num2);   // 输出 2

在上面的示例代码中,num1 表示十进制数 10,将其右移 2 位,得到二进制数 10,即十进制数 2,最后输出结果为 2。

需要注意的是,在右移操作中,如果原数是一个负数,则在移位时会在左侧补上 1,这样能保证负数的符号不变。

Java 位移 无符号右移(>>>)

Java中的无符号右移(>>>)是一种位运算符,它将操作数的二进制位向右移动指定的位数,并用零填充左侧的空位。与有符号右移运算符(>>)不同,无符号右移运算符(>>>)对于正数和负数都会按照正数进行处理,因此结果始终是正数。

无符号右移的语法如下:

value >>> num

其中,value是要进行位移的值,num是位移的位数。

下面是一个使用无符号右移运算符的例子:

int a = 10;       // a的二进制表示为 1010
int b = a >>> 1;  // b的二进制表示为 0101,即5

在这个例子中,变量a的二进制表示是1010,表示十进制的10。对a使用无符号右移运算符,移动1位,即把二进制表示向右移动1位,得到0101,即5。因此,变量b的值为5。

需要注意的是,无符号右移运算符只能用于整数类型,包括int、long、short、byte、char等。如果使用其他类型进行位移操作,则会出现编译错误。

无符号右移运算符通常用于处理无符号整数,例如IP地址等。