0

首先,请原谅我无知问这种问题,但由于我不擅长 Python,我无能为力。

我遇到了以下需要转换为 C++ 的 Python 代码。

def getSignedNumber(number, bitLength):
    mask = pow(2,bitLength) - 1
    if number & (1 << (bitLength - 1)):
        return number | ~mask
    else:
        return number & mask


def getUnsignedNumber(number, bitLength):
    mask = pow(2,bitLength) - 1
    return number & mask

这用于将 unsigned int 转换为有符号 int,反之亦然。但我不知道为什么我们必须这样做,因为我认为只需转换为相应的类型就足够了。也许是因为 Python 是一种动态类型的语言,需要这种操作?我在这里错过了什么吗?

4

1 回答 1

1

你是说reinterpret_cast还是dynamic_cast

长话短说:对于任意位长度的整数,您都需要它。下面的解释尝试:

getUnsignedNumber一块内存解释为一个 nBit 数。这是必要的,因为您只能以特定的块大小获得内存(通常您不能分配 3 位,您需要分配下一个更大的单元,一个字节(char))。因此,您需要确保忽略不需要的 5 个额外位。

getSignedNumber对有符号数做同样的事情,但是如果数字是负数,我们需要用符号位填充。因此,即使对于 c,您也需要此功能。(想象一下,您将 -3 存储在您的 char 中并希望将其读取为无符号 3 位数字)

看来,这用于正确填充数字,假设您有一个字符:

c = 10001111

现在,如果您想将其解释为四位有符号类型,则实际上必须输入

c = 11111111

因为如果一个数字在二进制中为负数,则它之前的所有位实际上都是一个。但是,如果您将其解释为 5 位有符号类型,您会看到符号位为 0,因此所有前导位都应为零。所以你必须掩盖它,这样

c = 00001111

于 2012-10-16T14:49:46.807 回答