带符号的二进制算数,逻辑左移右移
时间: 2024-12-28 14:25:16 浏览: 12
### 带符号二进制算术
带符号整数通常采用补码表示法来存储正负数值。对于一个给定的有符号整数,在执行算术运算时,计算机内部会自动处理符号位的影响。
#### 补码表示法中的加减乘除
当两个同类型的有符号数相加或相减时,如果结果超出了该数据类型所能表达的最大范围,则会发生溢出。然而,现代编程语言一般会对这种情形提供相应的异常检测机制或者饱和算法以防止错误的结果[^2]。
### 逻辑左移 (Logical Left Shift)
逻辑左移是指将一个二进制数按指定的数量向左移动若干位置的操作,并且在低位填充零。此操作相当于对该数进行了幂次增长的效果,即每左移一位就等于原数值乘以2的一次方。
例如,假设有一个8位无符号整型变量`a=00001010`(十进制值为10),那么将其逻辑左移两位后的结果将是`00101000`(十进制值为40):
```python
def logical_left_shift(value, n):
return value << n
```
### 算术右移 (Arithmetic Right Shift)
算术右移是一种特殊的右移方式,它不仅简单地把每一位都往右边挪动,还会复制最高有效位(符号位),从而保持原有数值的符号不变。这使得它可以用于实现地板除法的功能——即将某个数除以2的n次幂并取下界。
考虑之前提到的例子 `-19 >> 2 = -5` ,这里发生了两次算术右移,最终得到的是最接近于实际商的一个较小整数值[^1]:
```python
def arithmetic_right_shift(value, n):
return value >> n
```
### 逻辑右移 (Logical Right Shift)
不同于算术右移,逻辑右移总是用零填补腾出来的高位空间,而不关心原来的符号位是什么样的。因此,即使是对负数做逻辑右移也会获得正值作为输出;这一点可以从给出的例子中看到:`-19 >>> 2 = 1073741819` 。需要注意的是,Java 中只有 `>>>` 运算符实现了真正的逻辑右移功能,而 C/C++ 则依赖具体的编译器行为.
```java
public class Main {
public static void main(String[] args) {
System.out.println(Integer.toBinaryString(-19));
System.out.println((-19 >>> 2)); // 输出: 1073741819
}
}
```
阅读全文