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 を signed int に、またはその逆に変換するために使用されます。しかし、対応する型にキャストするだけで十分だと思うので、なぜこれをしなければならないのかわかりません。Python は動的型言語であり、この種の操作が必要なためでしょうか。ここで何か不足していますか?

4

1 に答える 1

1

reinterpret_castそれともdynamic_cast?_

簡単に言えば、これは任意のビット長の整数に必要です。以下の説明の試み:

はメモリのgetUnsignedNumberブロックを nBit 数値のように解釈します。特定のチャンクサイズでのみメモリを取得するため、これが必要です (通常、3 ビットを割り当てることはできません。次に大きな単位であるバイト (char) を割り当てる必要があります)。したがって、不要な 5 つの余分なビットを確実に無視する必要があります。

getSignedNumberは符号付きの数値に対しても同じことを行いますが、数値が負の場合は符号ビットをパディングする必要があります。したがって、c でもこの関数が必要です。(-3 を char に格納し、それを符号なしの 3 ビット数として読み取りたいと想像してください)

これは、数値の適切なパディングに使用されているようです。たとえば、char があるとします。

c = 10001111

これを 4 ビット符号付きの型として解釈したい場合は、実際には

c = 11111111

数値が 2 の補数で負の場合、その前のすべてのビットは実際には 1 です。ただし、これを 5 ビットの符号付きタイプとして解釈すると、符号ビットが 0 であることがわかります。したがって、先頭のビットはすべてゼロである必要があります。そのため、マスクする必要があります

c = 00001111

于 2012-10-16T14:49:46.807 に答える