ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java – 用整数和字节进行位移

2019-10-07 13:03:41  阅读:260  来源: 互联网

标签:java int byte bit-shift


考虑以下代码(其中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

解决方法:

将您的换档线转换为: –

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

您的RHS是一个int,您需要将其类型化为字节.

上面的代码将工作正常..有或没有将bitNumber转换为byte

所以,你也可以: –

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

但是,这是一个问题 – 字节bitMask = 0x8>> 3;工作正常..为什么会这样?

这里有一些例子来解释其工作背后的原因以及最终的行为: –

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

以下是解释上述行为的一些推理: –

>只有当编译器确定它能够在LHS的字节变量中容纳该值时,RHS上的值才会被隐式地进行类型化.否则,我们必须做Explicit类型转换来告诉编译器,我们知道我们在做什么,只为我们做..

现在让我们逐一考虑所有情况(从上面的代码(1-3,1-2): –

> varInt1最初包含3.因此RHS的值计算为64.虽然此值可能适用于LHS中的字节变量,但编译器也知道,可以更改varInt1的值.那么如果varInt1的值怎么办?在某个阶段变为4 ..然后它将无法工作..这就是为什么它不被允许..
>现在,在这种情况下,因为我们在这里明确使用了Integer Literal,所以编译器确保它可以容纳在byte中.所以它允许隐式转换..
>再次,在这种情况下,已知RHS将评估为128,不能在字节中容纳..再次失败..

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

>在这种情况下,编译器会看到,finalVarInt2包含值3.因此,RHS的计算结果为64,可以容纳在LHS的字节变量中.现在,由于变量是final,因此无法更改,并且Compiler知道,所以确定t *他的值总是64 * ..所以编译器允许这样做.
>在最后一种情况下,finalVarInt3的值是4 ..类似的推理..不适合LHS,因为RHS评估为128,不能适合字节

标签:java,int,byte,bit-shift
来源: https://codeday.me/bug/20191007/1867036.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有