甲可变长量(也被称为VLQ或uintvar
)是编码最多只能使用尽可能多字节根据需要一个28位整数值的方法。MIDI文件格式中使用了此格式,以最小化某些事件数据的大小。
它的工作方式非常简单。作为字节的高位优先级序列,每个字节的最高有效位(MSB)为a 1
,表示随后是另一个VLQ字节。每个字节的其余7位组成解码值。
示例(来自维基百科):
[ 0x86, 0xc3, 0x17 ] => 106903
挑战:
给定一个可变长度的数量,将其转换为整数值。
输入:
一到四个字节或32位值类型的列表,表示整数的有效VLQ。
输出:
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
注意:您不需要使用十六进制文字来表示一个字节作为输入或输出。您可以使用十进制文字([ 129, 128, 0 ]
),整数(0x80818000
如果更适合您的平台)或任何其他合理的字节/八位字节表示形式。格式很灵活,只要代表1-4个字节/八位字节即可。
打高尔夫球!
[0x01, 0x80, 0x02] => 1
?