가변 길이 량 (이라고도 VLQ 또는 uintvar
) 필요한만큼의 바이트로서 만 사용하여 28 비트 정수 값까지 인코딩하는 방법이다. 이것은 특정 이벤트 데이터의 크기를 최소화하는 방법 으로 MIDI 파일 형식 으로 사용되었습니다 .
작동 방식은 매우 간단합니다. 빅 엔디안 바이트 시리즈로서, 각 바이트의 최상위 비트 (MSB)는 1
다른 VLQ 바이트가 뒤따른다는 것을 나타내는 것입니다. 각 바이트의 나머지 7 비트는 디코딩 된 값을 구성합니다.
예 (Wikipedia에서) :
[ 0x86, 0xc3, 0x17 ] => 106903
추가 참조 : Wikipedia , Some Guy .
도전:
가변 길이 수량이 주어지면 정수 값으로 변환하십시오.
입력:
1에서 4 바이트의 목록 또는 정수의 유효한 VLQ를 나타내는 32 비트 값 유형입니다.
산출:
VLQ 입력의 정수 값입니다.
규칙과 득점 :
- 이것은 코드 골프이므로 각 언어에 대한 바이트 단위의 최단 답변이 승리합니다.
- 표준 규칙 및 기본 I / O 규칙이 적용됩니다.
- 허점 은 물론 금지되어 있습니다.
- 코드 테스트 ( TIO.run 등) 와 함께 링크를 제공하십시오 .
- 답을 명확하게 설명하는 것이 좋습니다.
- 이 변환을 처리하는 내장 기능은 금지 되지 않지만 사용 하지 않는 것이 훨씬 더 흥미 롭습니다.
테스트 사례 :
Input (VLQ) Output (int)
[ 0x00 ] => 0
[ 0x07 ] => 7
[ 0x7f ] => 127
[ 0x81, 0x00 ] => 128
[ 0xC0, 0x00 ] => 8192
[ 0xff, 0x7f ] => 16383
[ 0x81, 0x80, 0x00 ] => 16384
[ 0x86, 0xc3, 0x17 ] => 106903
[ 0xbd, 0x84, 0x40 ] => 1000000
[ 0xff, 0xff, 0x7f ] => 2097151
[ 0xC0, 0x80, 0x80, 0x00 ] => 134217728
[ 0xFF, 0xFF, 0xFF, 0x7F ] => 268435455
참고 : 바이트를 입력 또는 출력으로 나타 내기 위해 16 진 리터럴을 사용할 필요는 없습니다. 플랫폼에 더 적합한 경우 십진 리터럴 ( [ 129, 128, 0 ]
), 정수 ( 0x80818000
) 또는 기타 적절한 바이트 / 옥텟 표현을 사용할 수 있습니다. 형식은 1-4 바이트 / 옥텟을 나타내는 한 유연합니다.
멀리 골프!
[0x01, 0x80, 0x02] => 1
합니까?