c++ - 计算表示有符号整数所需的最小字节数

标签 c++ bit-manipulation bitwise-operators

我的任务看起来很简单,我需要计算表示一个可变整数所需的最小字节数(例如,如果整数是 5,那么我想返回 1;如果整数是 300,我想返回 2)。不是指数据类型 int,正如评论中指出的那样,它总是只是 sizeof(int),我指的是一个数学整数。我几乎有一个解决方案。这是我的代码:

int i;
cin >> i;
int length = 0;
while (i != 0) {
    i >>= 8;
    length++;
}

问题是这不适用于任何负数(我无法确定原因)或一些最高有效位为 0 的正数(因为符号位是使它成为 1 的位大一点)...关于如何处理这些情况,我可以获得任何提示或建议吗?

最佳答案

存储为单字节,
正数在 0x000x7F
范围内 负数在 0x800xFF

范围内

作为 2 个字节,
正数在 0x00000x7FFF
范围内 负数在 0x80000xFFFF

范围内

作为 4 个字节,
正数在 0x000000000x7FFFFFFF
范围内 负数在 0x800000000xFFFFFFFF

范围内

您可以使用如下函数来获取最小尺寸:

int getmin(int64_t i)
{
    if(i == (int8_t)(i & 0xFF))
        return 1;
    if(i == (int16_t)(i & 0xFFFF))
        return 2;
    if(i == (int32_t)(i & 0xFFFFFFFF))
        return 4;
    return 8;
}

然后例如,当您看到0x80 时,将其转换为-128。而7F被翻译成127,而0x801应该被翻译成正数。

请注意,这将非常困难且毫无意义,应避免。这不适合以三字节存储数字,为此,您必须构建自己的格式。

关于c++ - 计算表示有符号整数所需的最小字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48433741/

相关文章:

c++ - 将两种不同类型的模板定义专门化

c - 如何使用按位运算符返回 0 或 1

C:按位非结构体

c++ - ^= 是否在内存中创建一个临时变量?

python - 给定N,返回满足方程: N + M = 2 * (N XOR M)的M

c++:井字游戏中的LNK2019和1120错误

c++ - 编译器如何处理 SSE(或任何)内部函数?

c++ - .h 文件中的全局常量,将问题与 gcc 联系起来,适用于 g++

c++ - 如何检查数字 0 到 9 在 C++ 中的数字流中是否至少出现过一次?

python - 缓慢的按位运算