zoukankan      html  css  js  c++  java
  • Lucene的Vint类型详解

    Lucene Vint压缩策略是,用每个字节的最高位做标志位,后7位为有效算术位,如果标志位为1,则说明后一个字节和当前字节是同一个数字,为0说明后一个字节是一个新的数字

    Lucene源代码中进行存储和读取是这样的。OutputStream是负责写:

     1   /** Writes an int in a variable-length format.  Writes between one and
     2    * five bytes.  Smaller values take fewer bytes.  Negative numbers are not
     3    * supported.
     4    * @see InputStream#readVInt()
     5    */
     6   public final void writeVInt(int i) throws IOException {
     7     while ((i & ~0x7F) != 0) {
     8       writeByte((byte)((i & 0x7f) | 0x80));
     9       i >>>= 7;
    10     }
    11     writeByte((byte)i);
    12   }

    writeVint(压缩)步骤

    1. i & ~0x7F

       用int i的最低位byte和~0x7F(1000 0000)做与操作,如果为真则说明这个int在等于或者大于第8位的bit上依然还有有效bit,这些bit应该在后面的writeByte操作在写入(每次循环一个字节包括int的低位7个bit位和一个标志位)

    2 writeByte((byte)((i & 0x7f) | 0x80));

      写入一个byte,友i的最低7个bit位和一个标志位(置1)组成

    3  i >>>= 7;

       由于写入了7个bit位,所以i右移7位,使得后面的bit参与下一次写入

    4   writeByte((byte)i);

       如果循环结束,则说明i剩下的有效bit等于或者小于7位,则当前这次是最后一次writeByte,这时候第8位也不需要置1,直接写入这个byte皆可。

     ==============================================================================================================================================


    InputStream负责读

     public final int readVInt() throws IOException {
     7     byte b = readByte();
     8     int i = b & 0x7F;
     9     for (int shift = 7; (b & 0x80) != 0; shift += 7) {
    10       b = readByte();
    11       i |= (b & 0x7F) << shift;
    12     }
    13     return i;
    14   }

    1   byte b = readByte(); 

         先读取低位的一个byte

    2    int i = b & 0x7F;

         取这个字节的低7位(有效数字位)赋值给i

    3    for (int shift = 7; (b & 0x80) != 0; shift += 7)

         循环先判定当前byte(b)的第8位是不是为1,如果是1,则说明后面还有byte也是属于这个int, shift是表示当前b里的有效7位在i里面对于的bit位置,因为在循环开始就已经赋值过7bit,所以shift循环开始就从7开始算

  • 相关阅读:
    pe文件结构
    dll
    术语
    创建内存映射文件
    函数的调用约定
    串口
    linux 之 tcpdump
    linux 之程序管理
    perl 之eval
    2020-10-27_组合快捷键
  • 原文地址:https://www.cnblogs.com/hdflzh/p/4034811.html
Copyright © 2011-2022 走看看