java - 0x7f 有什么特别之处?

标签 java long-integer

我正在阅读 avro 格式规范并尝试了解其实现。这里是解码的方法long value :

  @Override
  public long readLong() throws IOException {
    ensureBounds(10);
    int b = buf[pos++] & 0xff;
    int n = b & 0x7f;
    long l;
    if (b > 0x7f) {
      b = buf[pos++] & 0xff;
      n ^= (b & 0x7f) << 7;
      if (b > 0x7f) {
        b = buf[pos++] & 0xff;
        n ^= (b & 0x7f) << 14;
        if (b > 0x7f) {
          b = buf[pos++] & 0xff;
          n ^= (b & 0x7f) << 21;
          if (b > 0x7f) {
            // only the low 28 bits can be set, so this won't carry
            // the sign bit to the long
            l = innerLongDecode((long)n);
          } else {
            l = n;
          }
        } else {
          l = n;
        }
      } else {
        l = n;
      }
    } else {
      l = n;
    }
    if (pos > limit) {
      throw new EOFException();
    }
    return (l >>> 1) ^ -(l & 1); // back to two's-complement
  }

问题是为什么我们总是检查 0x7f 是否小于我们刚刚读取的字节?

最佳答案

这是一种位打包形式,其中每个字节的最高有效位用于确定是否应读取另一个字节。从本质上讲,这允许您以比通常需要的更少的字节数对值进行编码。但是,需要注意的是,如果数字很大,则需要的字节数将超过正常。因此,当使用较小的值时,这是成功的。

回答你的问题,0x7F 是二进制的 0111_1111。可以看到最高有效位被用作标志位。

关于java - 0x7f 有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50764797/

相关文章:

java - JCEF 与 JavaFX fatal error

java - 用库类替换类

在 C 中将无符号长整型转换为二进制

java - 如何在 Java 中使用具有长值的 printf() 方法?

java - 如何在复合模式中设置不同的参数?

java - 在 Netbeans 7.2 中隐藏 TopComponent 选项卡

java - jdbi BindBean 用户定义的 bean 属性(嵌套对象)

java - 为什么 (long)9223372036854665200d 给我 9223372036854665216?

java - 数据类型不匹配?我把我所有的整数都转换成了长整数?

r - R中对长数的操作