当前位置: 首页 > 面试题库 >

Java-使用整数和字节进行位移位

严宸
2023-03-14
问题内容

考虑以下代码(其中byteIndex是一个int):

int bitNumber = b-(8*byteIndex);
bitMask = 0x8>>(byte)bitNumber;

这会产生错误

error: possible loss of precision

编译时(必需字节,位于int)。

代码

int bitNumber = b-(8*byteIndex);
bitMask = 0x8>>2;

编译良好。

这是什么问题,我该如何解决第一个示例以允许将整数值按int值进行移位?

编辑:根据评论,这是一个更完整的示例:

48) int byteIndex;
49) byte bitMask;
50) int bitNumber;
    // assign value to byteIndex
67) bitNumber = b-(8*byteIndex);
68) bitMask = 0x8>>bitNumber;

和给出的错误是:

...MyClass.java:68: error: possible loss of precision
    bitMask = 0x8>>bitNumber;
             ^
  required: byte
  found:    int
1 error

问题答案:

将您的shifting行转换为此:-

byte bitMask = (byte)(0x8>>(byte)bitNumber);

您的RHS是一个整数,您需要将其转换为字节。

上面的代码将正常工作..不管有没有castingbitNumberbyte

因此,您也可以:-

byte bitMask = (byte)(0x8>>bitNumber);

但是,这是一个问题- byte bitMask = 0x8>>3;工作正常。为什么会这样?

这是一些示例,解释其工作背后的原因以及其行为final:-

byte bitMask;
int varInt1 = 3;
final int finalVarInt2 = 3;
final int finalVarInt3 = 4;

bitMask = 0x8>>varInt1;    // 1. Will not work. 
bitMask = 0x8<<3;          // 2. Will work

bitMask = 0x8<<4;          // 3. Will not work
bitMask = 0x8<<finalVarInt2;   // 1. Will work
bitMask = 0x8<<finalVarInt3;   // 2. Will not work

以下是解释上述行为的一些原因:-

  • typecasted仅当编译器确定能够容纳byteLHS变量中的值时,RHS的值才会隐含。.另外,我们必须Explicit type casting告诉编译器我们知道自己在做什么,为我们做..

现在让我们一一考虑所有情况(根据上面的代码(1-3、1-2):-

  1. varInt1 最初包含 3个 。因此, RHS的 值为 64 。尽管此值可能会 byteLHS中 适应于变量,但是编译器也知道,可以更改 varInt1.. 的值,所以如果在某个阶段将value varInt1 更改为 4 怎么办。.那将不起作用。为什么不允许
  2. 现在,在这种情况下,由于我们已 Integer Literal 在此处显式使用了a ,因此编译器确定它会在 byte..中容纳,因此它允许 implicit 强制转换。
  3. 同样,在这种情况下,已知 RHS 将评估..中 128 不能容纳的内容 byte 。. 再次失败 ..

最后两种情况 与常规变量不同…由于已声明 final 它们,因此无法重新初始化它们。因此,编译器可以根据分配的值进行决策。

  1. 在这种情况下,编译器将看到 finalVarInt2* 包含值 3 。因此, RHS 评估为 64 ,可以将其容纳在 LHSbyte 变量中。现在,由于变量是无法更改的,并且知道这一点,因此可以确定t * 他的值将始终为 * ..因此编译器允许这样做。 final*Compiler 64

  2. 在后一种情况下,价值 finalVarInt3 是4 ..类似的推理..不适合在 LHS ,作为 RHS 计算结果为 128 ,可以不适合 byte



 类似资料:
  • 为什么在Java中字节的位移位行为是这样的?

  • 问题内容: 在使用on进行位移时,我注意到使用无符号右移()时会得到奇怪的结果。使用,右移(有符号:和无符号:)的行为均符合预期: 但是当我对进行相同操作时,无符号右移会发生奇怪的事情: 我认为可能是编译器正在内部将转换为,但似乎不足以解释这种行为。 为什么在Java中以字节的方式进行位移位? 问题答案: 这种情况正是因为被晋升到前执行按位运算。表示为: 因此,向右移至7或8位仍保留第7位1,因此

  • 我正在使用Processing通过串行端口向Arduino卡发送字节数组。我遇到了一个奇怪的问题,Arduino似乎无法“同步”读取数组——字节元素似乎已转移到Arduino代码。 例如,从处理I发送阵列: Arduino可以将其解读为: 这个问题是随机出现的——我尝试了大约1/3次,并且移位总是随机的。当它工作时,它会在会话期间继续工作,直到我重新启动连接。 还有其他人遇到过类似的问题吗?关于如

  • 我正在使用flyway 3.0进行数据库迁移。到目前为止,我只在SQL脚本中使用它。数据库:mySql。 这些脚本存储在数据库迁移下的 src/主/资源中。 现在我想添加一个基于Java的迁移文件,以便使用Java逻辑。我想使用Spring。 我应该在哪里存储类?我希望它们在我的项目包中位于src /主/java下:例如com。20.db迁移 有人能帮我弄一下maven和Spring的配置吗? 你

  • < b >想改进这个问题?通过编辑此帖子添加详细信息并澄清问题。 我知道java没有无符号整数,但是在Java SE 8中,有使用整数数据类型来执行无符号算术的方法。在java中,如何将位转换成“无符号整数”?

  • 你将得到一个由n个整数组成的数组,包括负整数和正整数。你需要把数组分成正数和负数。将数组的所有正整数添加到一个数组(或任何数据结构)中,并将所有负整数添加到另一个数组(或任何数据结构)中。如果输入数组的第一个元素是正数,则在第一行输出中按给定顺序打印所有正数,然后在第二行输出中按给定顺序打印所有负数,反之亦然。 注意事项: 将0视为正数。 输出中的正数和负数应遵循给定数组中元素的顺序。输出的每一行