varint 如何减少 space?
How do varints take less space?
我正在尝试了解 varint,我发现的最好的东西是 Google Protocol Buffers spec。
在他们的示例中,他们表明这个数字 1010 1100 0000 0010
在使用 varints 编码时是 300
而不是 44034
.
通常数字 300 占用两个字节 (1 0010 1100
),但在他们的示例中,300 也是如此。 varints实际上比普通ints占用更少的字节?
300 通常占用两个字节,如果您使用 2 字节的固定格式 来表示它。如果您使用的是 4 字节或 8 字节格式,则需要 4 个字节或 8 个字节。如果您使用的是 1 字节格式,则根本无法表示 300,除非您使用的是非常奇怪的编码。
如果您想使用可变长度编码,那么标准的 2 的补码表示是不够的,因为它没有长度信息。您不会知道数字 在何处停止 。您可以单独编码长度,但这会增加您的 space 要求......或者您可以使用类似 protobuf varint 表示的东西,它可以在 2 个字节中表示 300 和 包括表示此时数字已完成的信号。
(或者您可以使用许多其他编码中的一种。Protobuf varints 并没有明确优于其他表示,即使就使用的 space 而言也是如此。总是要权衡取舍。)
我正在尝试了解 varint,我发现的最好的东西是 Google Protocol Buffers spec。
在他们的示例中,他们表明这个数字 1010 1100 0000 0010
在使用 varints 编码时是 300
而不是 44034
.
通常数字 300 占用两个字节 (1 0010 1100
),但在他们的示例中,300 也是如此。 varints实际上比普通ints占用更少的字节?
300 通常占用两个字节,如果您使用 2 字节的固定格式 来表示它。如果您使用的是 4 字节或 8 字节格式,则需要 4 个字节或 8 个字节。如果您使用的是 1 字节格式,则根本无法表示 300,除非您使用的是非常奇怪的编码。
如果您想使用可变长度编码,那么标准的 2 的补码表示是不够的,因为它没有长度信息。您不会知道数字 在何处停止 。您可以单独编码长度,但这会增加您的 space 要求......或者您可以使用类似 protobuf varint 表示的东西,它可以在 2 个字节中表示 300 和 包括表示此时数字已完成的信号。
(或者您可以使用许多其他编码中的一种。Protobuf varints 并没有明确优于其他表示,即使就使用的 space 而言也是如此。总是要权衡取舍。)