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

我正在读取字节如下:


        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 位。我需要它来返回此方法中的字符集。


如果你能帮助我,我将不胜感激。我期待着尽快收到您的来信。


MYYA
浏览 164回答 2
2回答

幕布斯7119047

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

暮色呼如

[0, 255] 范围意味着您使用所有 8 位作为值,而不留下最高有效位作为符号。FileInputStream.read()读取一个字节的数据。该int返回类型允许发现之间的差值-1数据和-1用于用信号通知的流的末尾。实际上,read()返回值不会大于 255。如果您想查看最后 3 位,请使用位掩码。您可以使用二进制文字来定义您的掩码:int mask = 0b111; int lastBits = readBytes & mask;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java