Lucene VInt 학습
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;
}
발췌
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.