0

ここでいくつかの質問/回答を読んでいます:

python の 2 の補数

同数の正数の2の補数表記

誰かが数の 2 の補数を作成するサンプル コードを提供しました。

def twos_comp(val, bits):
    """compute the 2's compliment of int value val"""
    if( (val&(1<<(bits-1))) != 0 ):
        val = val - (1<<bits)
    return val

さらに、誰かが 2 の補数を次のように定義しました。

2 の補数表記では、n ビットの 2 の補数を使用して符号を反転します。8 ビットの数値の場合、数値は 2^8 から減算され、その負数が生成されます。

これらの宣言は揺るぎないものでした。しかし、それは私の2の補数の理解に反するものです。2進数を反転して1を足す計算だと思っていました。

さらに、2 の補数は元の数の加法逆数であるという性質を持っているはずです。しかし、 twos_comp からの出力にはそれがないようです。私の手計算 (および私が書いたいくつかのテスト コード) で定義 を使用すると、数値とその 2 の補数を加算すると、1 がオーバーフローし、残りのビットがゼロになるため、加法性があることがわかります。逆プロパティ。

2 の補数には複数の定義がありますか、私は混乱していますか、それとも他の投稿からのその定義と関数は単に間違っていますか?

4

1 に答える 1

1

2 の補数は、実際には 2 進数を反転し、負の数の場合は 1 を加算して計算されます。abs(-1)=1=01 -> bitwise_inv(abs(-1))+abs(-1)=FE+1=FF. これは、2^8 から数値を減算するために提供された定義と同じです (これはわかりにくいはずではありません)。

あなたが提供したサンプルコードは、有用な方法で2の補数を計算しません。何をしようとしているのかまったくわかりません。数値から2 * 8を減算するため、「2 ^ 8から数値を減算する」とはまったく異なるように見えますが、値を参照するときにそれを覚えていないこともあります2 の補数の意味は、その符号なしの値です。

同じテンプレートを使用した、より正確な実装を次に示します。これは正確に「2^8 から数値を引く」ことに注意してください。

def twos_c(val,bits):
  if ((val&(1<<(bits-1)))!=0):
    val=(1<<bits)-abs(val)
  return val
于 2013-10-31T15:13:16.847 に答える