Java:负数右移

标签 java bit-manipulation bitwise-operators bit-shift negative-number

我对负数的右移操作很困惑,这里是代码。

int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));

结果是:

11111111111111111111111111110001
11111111111111111111111111111111

为什么将负数右移 31 而不是 1(符号位)?

最佳答案

因为在 Java 中没有无符号数据类型,所以有两种类型的右移:arithmetic shift >>logical shift >>> . http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

算术移位 >>将保留符号位。
Arithmetic shift

无符号移位 >>>不会保留符号位(因此填充 0 s)。
Logical shift

(来自维基百科的图片)


顺便说一下,算术左移和逻辑左移的结果是一样的,所以只有一个左移<< .

关于Java:负数右移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457893/

相关文章:

Java - 根据对象使用JSON库从json读取数据

java - JSP - 只能导入一个类型。 Name.pacakge.class 解析为一个包,但类在那里

java - 如何增加Wildfly中的最大连接数、流和线程数?

java - 以编程方式在 TextView 中设置文本的正确方法

assembly - 如何在 mips 程序集中注册 "NOT"

c# - 将整数中的一位与另一位交换,代码不起作用

language-agnostic - 计算非对称字节

c - 通过位操作将数据存储在变量中

javascript - JS Bitwise - Math.random() * 2 被解释为 0 和 1 以进行按位或 (|) 运算的规则是什么?

bitwise-operators - 是否可以使用整数算术实现按位运算符?