当前位置: 首页 > 知识库问答 >
问题:

在java中,为什么字节类型可以使用&0xff进行无符号右移操作?

袁鸿达
2023-03-14
byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);

D的答案等于C。但E的安瑟是正确的。我想不出原因。

谢谢

共有1个答案

鲁浩言
2023-03-14

如前所述,Java总是使用ints或更大的值进行计算,因此

考虑b=11110001(注意顶部位是设置的,所以b实际上是-15)

隐式转换为int:
(int)b=1111....1111 0001

考虑e=(byte)((b&0xff)>>4);

隐式转换为int:
(int)b=1111........1111 0001

并且使用0xff:
x&0xff=0000······0000 1111 0001

 类似资料:
  • 问题内容: 为什么Java编译器不会让我把成,是8位长,而这正大小的数据类型。 有人可以解释为什么1有效,为什么2不有效吗? 编辑 我读了答案,声称0xff是255,怎么办?不是吗,是什么导致0xff,-128或255或其他原因。为什么不将其视为字节,而不是将该字节的8位视为1。 问题答案: 在Java 类型是一个8位有符号整数类型与在范围内的值来。文字表示哪个超出了该范围。 在第一个示例中,您试

  • 问题内容: 考虑以下Java代码片段 输出: 预期输出: 怎么样?作为 无符号右移后的二进制形式的b,因此为什么 呢? 问题答案: 问题在于,在进行移位操作之前,所有参数都首先被提升为: 已签名,因此其值为-15。 首先将符号扩展为整数,然后向右移,并通过强制转换为截断为。 首先将符号扩展为整数,然后向右移,并通过强制转换为截断为。 您可以做以获得所需的效果。

  • 我正试图将Java代码移植到C#中,但我遇到了与无符号shift right运算符有关的奇怪错误>>>通常代码: 这样的事情在C#中怎么可能呢? 我希望尽可能地保留代码语义,因为它是一个相当复杂的代码体。

  • 简单的问题:为什么如果我在Java中对字节变量应用无符号右移(也是短的),它就像int一样威胁它: 控制台输出:

  • 问题内容: 我了解Java中的无符号右移运算符“ >>>”是什么,但是为什么我们需要它,为什么我们不需要相应的无符号左移运算符? 问题答案: 该运营商允许你将和为32位和64位 无符号 整型,这是从Java语言缺少的。 当您移动不代表数值的内容时,这很有用。例如,您可以使用32位s 表示黑白位图图像,其中每个位图在屏幕上编码32个像素。如果需要将图像向右滚动,则希望将an左侧的位变为零,以便可以轻

  • 问题内容: 我正在尝试将无符号字节转换为带符号字节。问题是我接收的数据是无符号的,并且Java不支持无符号字节,因此当它读取数据时,会将其视为已签名。 我尝试通过从Stack Overflow获得的以下解决方案将其转换。 但是当再次将其转换为字节时,我得到了相同的签名数据。我试图将这些数据用作Java函数的参数,该Java函数仅接受字节作为参数,因此我不能使用任何其他数据类型。我该如何解决这个问题