GESP四级:变长编码:避免了直接的二进制转换

原题目变长编码: https://www.luogu.com.cn/problem/B3870

using namespace std;
long long n;
string a= "0123456789ABCDEF";
void print(int i){
	cout << a[i/16] << a[i%16]<<" ";
}
int main() {
    cin >> n;
    if (n == 0) { cout << "00"; return 0; }
    while (n > 0) {
        int k = n % 128;      // 取出当前最低的7位
        n = n >> 7;              // 去掉这7位,相当于右移7位 等价于n/=128
        if (n > 0)             // 如果还有更高位,说明当前不是最后一组
            print(k + 128);     // 最高位设为1,即加上128
        else
            print(k);           // 最后一组,最高位为0
    }
    return 0;
}

n % 128 等价于 n & 127(127 的二进制是 01111111,即低 7 位全 1,最高位 0),因为模 128 运算只保留除以 128 的余数,而 128 是 2^7,所以余数恰好是二进制表示的最低 7 位。例如:

  • 数字 926 的二进制:1110011110(10 位),低 7 位是 011110?实际计算:926 ÷ 128 = 7 余 30,余数 30 的二进制是 0011110(7 位),正是低 7 位。
    因此,n % 128 可以方便地取出当前最低的 7 位数值,用于分组.

haihaihai

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注