Java中负数的右移

我们知道,在Java中常用的位移运算有三种,分别是:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

这一次,我们来看一下其中的带符号右移运算符>>在负数计算时的效果。

首先,是一段测试代码:

public static void main(String[] args) {
     int num = -10;
     System.out.println(num >> 1);
     System.out.println(num >> 2);
 }

读者可以先思考一下输出为多少?输出:

-5
-3

看到这个结果,可能读者就有点疑问了,一般来说,左移右移不是相当于乘以2或者除以2么,为什么这里会出现-3呢?

我们首先需要明确的是,>>运算符叫做带符号右移,也即为其在运算时的规则为在要处理的数字的左端补一个等于符号位的数字,即为正数补0,负数补1。可以记为:符号位不变,左边补上符号位。

下面一个问题就是,这个运算符所操作的对象是什么呢?可能第一反应是:不就是左边的这个数么?这么说当然没有问题,但是计算机中存储的数字并不是直观上我们看到的这个数,计算机中所存储和操作的是数字的补码,如果是正数的话,就不用考虑这么多,但是如果是负数的话,就要注意了。

这里,笔者用8位的数字来说明一下为什么’-5 >> 1 = -3`。

首先,我们看一下-5的形式:
源码:1000 0101
反码:1111 1010
补码:1111 1011

左移一位之后:
补码:1111 1101
反码:1111 1100
原码:1000 0011

那么现在看一下,结果-3已经出现了。

因此,在遇到负数的位移运算的时候,写代码之前还是要好好考虑一下的。

### 负数的算术右移操作及其行为 在计算机中,负数的算术右移(`>>`)是一种位运算操作,其核心行为是将二进制表示的数值向右移动指定的位数,并通过特定规则填充左侧空出的高位。这种操作在处理负数时与正数有所不同,因为负数在计算机中是以**补码**形式存储和处理的。 #### 算术右移的基本规则 - **低位溢出**:右侧多余的位被丢弃。 - **符号位不变**:左端用符号位(最高位)填充,即正数补0,负数补1。 - **保持符号一致性**:由于使用补码表示法,右移后的结果仍然保持原数的符号属性[^1]。 #### 补码的作用 在进行位运算时,所有操作都是基于**补码**进行的。这意味着无论是正数还是负数,它们的位运算都以补码形式执行: - 正数的原码、反码、补码相同。 - 负数的补码由原码取反后加1得到。 例如,对于 `-12` 的右移操作: - 原码为 `1000 1100` - 反码为 `1111 0011` - 补码为 `1111 0100` 当进行右移3位操作时,符号位保持不变,左侧补1,得到新的补码 `1111 1110`,再将其转换回原码即可得到最终结果 `-2` [^1]。 #### 负数右移的具体计算步骤 以 `-19` 的右移一位为例,演示完整过程: - `-19` 的补码为 `1110 1101` - 右移一位后,高位补1,得到 `1111 0110` - 将该补码转换回原码时,先减1得到 `1111 0101`,再取反得到 `1000 1010`,最终结果为 `-10` [^3]。 #### 实际代码示例 以下是一个简单的 Java 示例,展示如何对负数进行算术右移并输出结果: ```java public class RightShiftExample { public static void main(String[] args) { int num = -12; int shifted = num >> 3; // 右移3位 System.out.println("Result of -12 >> 3: " + shifted); // 输出 -2 } } ``` #### 行为分析 - **符号扩展**:在右移过程中,符号位不会改变,这保证了数值的符号一致性。 - **除法近似**:对于正数,右移n位等价于除以 $2^n$ 并向下取整;而对于负数,则等价于向上取整。例如: - `7 >> 1` 等于 3(相当于 $7 / 2 = 3.5$ 向下取整) - `-7 >> 1` 等于 -4(相当于 $-7 / 2 = -3.5$ 向上取整) #### 总结 负数的算术右移本质上是基于补码的操作,它不仅保留了符号位的一致性,还确保了数值在右移后的语义正确性。这种机制使得计算机能够在不区分正负的情况下统一处理所有整数的位运算。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值