プロが教えるわが家の防犯対策術!

情報の授業の「補数表現」に関する質問です
100100→反転→011011→1を足す→011100
100100→1を引く→100011→反転→011100
「1を引いて反転」と「反転して1を足す」の値が同じになったのですが、これは偶然でしょうか?それとも必然でしょうか?

A 回答 (5件)

元の数をaとすると


反転とは2進6桁なら 2^6-1-a だから1を足すと 2^6-a
a-1の反転は 2^6-1―(a-1)=2^6-a

同じです。

因みに2^6-1=111111(2進)
これから100100をひくと、各桁の計算は1-1=0 又は 1-0=1だから、
011011 になり反転します。
    • good
    • 0

伝統的に、それを「2の補数表現」と呼ぶのだけれど、


6ビットなら「2^6の補数表現」と言わなきゃオカシイ
と前々から感じているんだよね。 何が2か?と。

000000→反転→111111→1を足す→1000000 ←0と一致しない
000000→1を引く ←負数が無ければ、そもそも引けない
足すとか引くとかいうのが mod 2^6 の話だという前提がなければ
なりたたないことなんだよ。

mod 2^n の話であれば、 x をビット反転したものと x との和が
全ビット 1、すなわち 2^n - 1 になることから、
x →反転→ (2^n - 1) - x →1を足す→ 2^n - x ≡ -x,
x →1を引く→ x-1 →反転→ (2^n - 1) - (x-1) = 2^n - x ≡ -x
になって、どちらも ≡ -x (mod 2^n) で一致する。これは必然。
    • good
    • 0

反転は全ビット1から引くという意味。


全ビット1=-1と言う意味だから、-1から引くという事。

-1-a+1=-a
-1-(a-1)=-a
    • good
    • 0

必然です。


「逆演算」をしているわけですから。

あなたの書かれた
(A) 100100→反転→011011→1を足す→011100
(B) 100100→1を引く→100011→反転→011100
の (B) は、逆のプロセスで書けば
 011100→反転→100011→『1を足す』→100100
ということで、(A) と同じプロセスであることが分かりますよね?


「補数」(この場合はわざわざ「2の補数」と呼ぶらしい)とは
 100 100 + 011 100 = 1 000 000   ①
になる関係です。
たし合わせると1つ上に桁上がりするということ。

「6ビット」で数値を扱うことにすれば(レジスターが6個しかないコンピュータに相当)、①の「7ビット目」は「桁あふれ」でどこかに消えてしまいます。結果として
「足し合わせると 0 になった」
ということになります。
つまり、一方は他方の「絶対値が同じ負数」であるとみなせるということです。

なので、コンピュータではこれを「負数」として扱うことにしています。
もちろん「数値を何ビットで扱うことにするか」を決めて、その「1ビット上」が桁上がりで消滅することを使うので、「何ビットで表現するか」を決めないと「補数」も決まりません。
    • good
    • 0

ビット反転が「-1 から引く」ことに相当する, ということを理解していれば「当然そうなるに決まっている」と一瞬で判断できる.

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A