为了账号安全,请及时绑定邮箱和手机立即绑定

如何在从 FileInputStream.read() 分配的 int 的前 3 位中查找模式

如何在从 FileInputStream.read() 分配的 int 的前 3 位中查找模式

MYYA 2021-11-03 10:44:15
我正在读取字节如下:        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是值-57aka 0xC7,当符号扩展到 an 时int就变成-57aka 0xFFFFFFC7

当你向右移位,通过5( >>> 5),你会得到0x07FFFFFE又名134217726

由于您只对该值的最低 3 位感兴趣,因此您需要屏蔽它:(val >>> 5) & 0x07,这将为您提供所需的内容:0x06aka0b110


查看完整回答
反对 回复 2021-11-03
?
暮色呼如

TA贡献1853条经验 获得超9个赞

[0, 255] 范围意味着您使用所有 8 位作为值,而不留下最高有效位作为符号。

FileInputStream.read()读取一个字节的数据。该int返回类型允许发现之间的差值-1数据和-1用于用信号通知的流的末尾。实际上,read()返回值不会大于 255。

如果您想查看最后 3 位,请使用位掩码。您可以使用二进制文字来定义您的掩码:

int mask = 0b111;
int lastBits = readBytes & mask;


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信