java - 应用于字节变量的无符号右移行为

标签 java bit-shift

考虑下面的 java 代码片段

byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);

输出:

c=0xff
d=0xff

预期输出:

c=0x0f

怎么样? 作为二进制中的 b 1111 0001 在无符号右移后 0000 1111 因此 0x0f 但为什么它是 0xff 怎么样?

最佳答案

问题是在移位操作发生之前,所有参数首先被提升为 int:

byte b = (byte) 0xf1;

b 是有符号的,所以它的值为 -15。

byte c = (byte) (b >> 4);

b 首先符号扩展为整数 -15 = 0xfffffff1,然后右移至 0xffffffff 并截断为 0xff 被强制转换为 byte

byte d = (byte) (b >>> 4);

b 首先符号扩展为整数 -15 = 0xfffffff1,然后右移至 0x0fffffff 并截断为 0xff 被强制转换为 byte

你可以做 (b & 0xff) >>> 4 来得到想要的效果。

关于java - 应用于字节变量的无符号右移行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3948220/

相关文章:

c# - 从 bat 文件运行 Java .jar 和 Windows .exe

java - java中如何检查字符串是否包含任何运算符

java - 如何比较 Android Firebase 中不同引用的两个子节点?

java - 为什么 11010100 << 1 等于 110101000,而不是 10101000?

go - 无效操作 : shift of type float64

java - 如何简单地读取我创建的 .txt 文件并计算其行数

java - 远程客户端上的 EJB

c - C 中的位掩码范围

java - 我可以使用每次迭代移动 1 个新位的 for 循环来获取 Java 中的某个 8 位数字吗?

java - 从字节数组中获取一系列位