Một đại lượng có độ dài thay đổi (còn được gọi là VLQ hoặc uintvar
) là một cách để mã hóa giá trị số nguyên 28 bit chỉ sử dụng càng nhiều byte nếu cần. Điều này đã được sử dụng ở định dạng tệp MIDI như một cách để giảm thiểu kích thước của dữ liệu sự kiện nhất định.
Cách thức hoạt động khá đơn giản. Là một chuỗi byte lớn về cuối, bit quan trọng nhất (MSB) của mỗi byte là 1
để chỉ ra rằng một byte VLQ khác theo sau. 7 bit còn lại của mỗi byte tạo nên giá trị được giải mã.
Ví dụ (từ Wikipedia):
[ 0x86, 0xc3, 0x17 ] => 106903
Tài liệu tham khảo bổ sung: Wikipedia , Một số chàng trai .
Thử thách:
Cho một đại lượng có độ dài thay đổi, chuyển đổi nó thành giá trị nguyên.
Đầu vào:
Danh sách từ một đến bốn byte hoặc loại giá trị 32 bit đại diện cho một VLQ hợp lệ của một số nguyên.
Đầu ra:
Giá trị nguyên của đầu vào VLQ.
Quy tắc và tính điểm:
- Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng.
- Quy tắc chuẩn và quy tắc I / O mặc định được áp dụng.
- Lỗ hổng bị cấm (tất nhiên).
- Vui lòng cung cấp liên kết với một bài kiểm tra cho mã của bạn ( TIO.run , v.v.).
- Một lời giải thích rõ ràng cho câu trả lời của bạn là rất khuyến khích.
- Các phần mềm tích hợp xử lý chuyển đổi này không bị cấm, tuy nhiên việc không sử dụng chúng sẽ thú vị hơn rất nhiều.
Các trường hợp thử nghiệm:
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
Lưu ý: bạn không bắt buộc phải sử dụng chữ hex để biểu thị một byte làm đầu vào hoặc đầu ra của bạn. Bạn có thể sử dụng số thập phân bằng chữ ( [ 129, 128, 0 ]
), số nguyên ( 0x80818000
) hoặc bất kỳ biểu diễn byte / octet hợp lý nào khác nếu phù hợp hơn với nền tảng của bạn. Định dạng là linh hoạt miễn là nó đại diện cho 1-4 byte / octet.
Chơi gôn đi!
[0x01, 0x80, 0x02] => 1
?