我正在读取字节如下: try(FileInputStream f = new FileInputStream("nameOfFile")){ int readByte = 0; int mask =0b111; while((readByte=f.read())!=-1) { System.out.println(Integer.toBinaryString(readByte & mask)); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }但是,当我尝试获取构成数字的 8 位时,有时我会得到 7 位甚至比 8 位更多的位。有人可以帮我解决这个问题吗?我想获得 8 位,以便之后我可以查看前 3 位。我需要它来返回此方法中的字符集。如果你能帮助我,我将不胜感激。我期待着尽快收到您的来信。
2 回答
幕布斯7119047
TA贡献1794条经验 获得超8个赞
Abyte
是一个 8 位二进制补码有符号数。
如果您认为一个字节的值为 0..255,那么您就错了。这 8 位是 -128..127,因为第 7 位是符号位。
当您使用诸如 之类>>>
的运算符进行位操作时,byte
首先将the扩展为 an int
,这意味着应用了符号扩展。
因此,无符号值199
(示例)是 bits 11000111
,它作为 abyte
是值-57
aka 0xC7
,当符号扩展到 an 时int
就变成-57
aka 0xFFFFFFC7
。
当你向右移位,通过5( >>> 5
),你会得到0x07FFFFFE
又名134217726
。
由于您只对该值的最低 3 位感兴趣,因此您需要屏蔽它:(val >>> 5) & 0x07
,这将为您提供所需的内容:0x06
aka0b110
暮色呼如
TA贡献1853条经验 获得超9个赞
[0, 255] 范围意味着您使用所有 8 位作为值,而不留下最高有效位作为符号。
FileInputStream.read()
读取一个字节的数据。该int
返回类型允许发现之间的差值-1
数据和-1
用于用信号通知的流的末尾。实际上,read()
返回值不会大于 255。
如果您想查看最后 3 位,请使用位掩码。您可以使用二进制文字来定义您的掩码:
int mask = 0b111; int lastBits = readBytes & mask;
添加回答
举报
0/150
提交
取消