java - 无符号右移运算符用作正常的右移运算符,为什么?
问题描述
当我在 java 中使用无符号右移(逻辑移位)运算符时,我得到的结果与普通右移运算符给出的结果相同。我的代码是:
byte b1 = -99; // 01100011
byte result = (byte) (b1 >>> 6);
String str = String.format("%8s", Integer.toBinaryString(result & 0xFF)).replace(' ', '0');
System.out.println("result: " + result);
前面的代码使用 of>>
和>>>
运算符产生相同的输出,即 -13,这背后的原因是什么以及如何解决它?
解决方案
首先,byte
在 Java 中是有符号类型,并且位移(无论是普通的还是带符号扩展的)都是在 中完成的int
,所以在执行位移之前,将 的值b1
隐式转换回 int (保留符号)。(顺便说一句,值 -99 不是 01100011,而是 1001 1101 inbyte
和 1111 1111 1111 1111 1111 1111 1001 1101 in int
)。
使用b >> 6
(or -99 >> 6
) 时,值为 -2 (1111 1111 1111 1111 1111 1111 1111 1110),使用b >>> 6
(or -99 >>> 6
) 时,inint
值为 67108862 (0000 0011 1111 1111 1111 1111 1111 1110)。但是,当您随后转换为 时byte
,最后一个值也变为 -2 (1111 1110)。
您需要做的是确保在移位之前将字节的无符号值作为整数值:
byte result = (byte) ((b1 & 0xFF) >>> 6);
结果为2。
推荐阅读
- node.js - How to save array of json in mongoose
- elasticsearch - Elasticsearch 西班牙语词干无法使用“rojo”颜色
- python - Accessing Elements of a Deeply Nested Python Dictionary
- ssl - Connecting to CloudSQL from Kubernetes: cannot validate certificate
- reactjs - How to access the value from set-cookie in React?
- c# - Entity Framework Core 在多对多上添加新条目时尝试添加旧条目
- angular - Dynamic menu dropdown from database in angular
- php - How to remove last value in an from an object in php
- reactjs - Cloud Firestore 的性能问题
- python - 如何对目录中的 keras 图像数据集使用交叉验证?