Lucene VInt 학습

2269 단어 .netBlogLucene
VINT 형식 루틴은 가변 길이의byte 조합으로 정수를 표시하는 정의를 내렸다
VInt lucene에서 예표를 제시했습니다.
 
Value
First byte
Second byte
Third byte
0
00000000
 
 
1
00000001
 
 
2
00000010
 
 
...
 
 
 
127
01111111
 
 
128
10000000
00000001
 
129
10000001
00000001
 
130
10000010
00000001
 
...
 
 
 
16,383
11111111
01111111
 
16,384
10000000
10000000
00000001
16,385
10000001
10000000
00000001
표의 데이터를 보면 하나의byte가 0-127의 정수를 나타낸다. 만약에 횟수<=127이 하나의byte만 차지하고 만약>127이 이 정수의 값을 저장하기 위해 byte를 추가한다. 그러면 첫 번째byte와 두 번째byte의 관계와 규칙은 무엇일까. 표의 표현 형식을 보면 이byte가 표시하지 않으면 현재byte의 2진법의 첫 번째 위치를 1로 바꾸는 것 같다.이렇게 되면 기호 위치의 표시가 없다. 첫 번째 0 설명은 하나의byte 첫 번째 1 설명은 다음에 byte가 이 숫자를 저장할 수 있다는 것을 의미한다.루틴 코드에 int 숫자를 VInt 형식으로 변환할 수 있는byte를 저장하는 것을 보십시오
/** Writes an int in a variable-length format.  Writes between one and  
   * five bytes.  Smaller values take fewer bytes.  Negative numbers are not  
   * supported.  
   * @see IndexInput#readVInt()  
   */  
  public void writeVInt(int i) throws IOException {   
    while ((i & ~0x7F) != 0) {   
      writeByte((byte)((i & 0x7f) | 0x80));   
      i >>>= 7;   
    }   
    writeByte((byte)i);   
  }  

 
이렇게 자리를 옮긴 다음에 읽을 때 루틴의 역방향 위치 연산 코드를 보세요.
 
/** Reads an int stored in variable-length format.  Reads between one and  
   * five bytes.  Smaller values take fewer bytes.  Negative numbers are not  
   * supported.  
   * @see IndexOutput#writeVInt(int)  
   */  
  public int readVInt() throws IOException {   
    byte b = readByte();   
    int i = b & 0x7F;   
    for (int shift = 7; (b & 0x80) != 0; shift += 7) {   
      b = readByte();   
      i |= (b & 0x7F) << shift;   
    }   
    return i;   
  }  

 
 
발췌

좋은 웹페이지 즐겨찾기