在使用on进行位移时byte
,我注意到使用无符号右移(>>>
)时会得到奇怪的结果。使用int
,右移(有符号:>>
和无符号>>>
:)的行为均符合预期:
int min1 = Integer.MIN_VALUE>>31; //min1 = -1
int min2 = Integer.MIN_VALUE>>>31; //min2 = 1
但是当我对进行相同操作时byte
,无符号右移会发生奇怪的事情:
byte b1 = Byte.MIN_VALUE; //b1 = -128
b1 >>= 7; //b1 = -1
byte b2 = Byte.MIN_VALUE; //b2 = -128
b2 >>>= 7; //b2 = -1; NOT 1!
b2 >>>= 8; //b2 = -1; NOT 0!
我认为可能是编译器正在内部将转换byte
为int
,但似乎不足以解释这种行为。
为什么在Java中以字节的方式进行位移位?
这种情况正是因为byte
被晋升到int
前执行按位运算。int -128
表示为:
11111111 11111111 11111111 10000000
因此,向右移至7或8位仍保留第7位1,因此结果缩小为负值byte
。
比较:
System.out.println((byte) (b >>> 7)); // -1
System.out.println((byte) ((b & 0xFF) >>> 7)); // 1
通过b & 0xFF
,在移位之前清除所有最高位,因此按预期产生结果。
为什么在Java中字节的位移位行为是这样的?
问题内容: 考虑以下代码(其中byteIndex是一个int): 这会产生错误 编译时(必需字节,位于int)。 代码 编译良好。 这是什么问题,我该如何解决第一个示例以允许将整数值按int值进行移位? 编辑:根据评论,这是一个更完整的示例: 和给出的错误是: 问题答案: 将您的行转换为此:- 您的RHS是一个整数,您需要将其转换为字节。 上面的代码将正常工作..不管有没有的到 因此,您也可以:-
问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符
问题内容: 我如何迭代字节数组中的位? 问题答案: 你必须写自己的实施历时字节数组,然后创造价值,其记忆中的当前索引的字节数组 和 当前字节中的当前索引。然后像这样的实用方法会派上用场: (范围为0到7)。每次调用时,您都必须在当前字节中增加位索引,并且在到达“第9位”时也必须增加字节数组中的字节索引。 这并不 难 -有点痛苦。让我知道您是否需要示例实现…
5、带进位的循环移位指令 带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。 指令的格式:RCL/RCR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示
问题内容: 我有一个这样的测试程序: 它产生以下输出: 我期望(1)和(3)相同,以及(2)和(4)相同。 使用gcc版本:gcc.real(Ubuntu 4.4.1-4ubuntu9)4.4.1 怎么了? 问题答案: 根据C标准 §6.5.7.3 ,按类型大小移动是未定义的行为: 6.5.7按位移位运算符 (…)如果右操作数的值为负或大于 或等于 提升后的左操作数的宽度,则行为未定义。 您的编译