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

情報処理試験(基本情報)用の考え方という前提でお聞きします。

「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。
この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします)
として記述されているものは、もう2の補数になっていると考えていいのでしょうか?
それともこれを、今から2の補数に直すのですか?
(もし直すのであれば、最上位ビットの符号が変わるのでしょうか?)

違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、
「-A」の2の補数は「A」になるんでしょうか?
それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という
ことになるのでしょうか?

解りにくくてすみません。

A 回答 (3件)

符号付2進数だと書いてあるなら普通は最上位ビットが符号になっています。

それでマイナスの場合は最上位ビットが1で、2の補数表現になっています。

10101 を5ビットの符号付2進数とすると最上位が1なのでマイナスです。なので分かりやすくするためにまずはプラスにしたとすると (1, 0 を反転させてプラス1する。つまり符号反転させるために2の補数を求める) 01011 で、これは10進数では 11 です。なので元の 10101 は10進数では -11 を表していたということになります。

A の2の補数が -A なら -A の2の補数は A になるのかとのことですが、それはその通りです。ビットの 0, 1 を反転させて1を加えるということを2回繰り返すと元の値になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
2の補数は必ずしも、符号ビットが負数(1)とは限らないということですね。
そうなるとやっぱり、いったいどれが2の補数に変換してあって、
どれがしてないというのが、解らない・・・。
単純に「次の数の2の補数を求めなさい」という問題が出てくれることを
期待します。ありがとうございました。

お礼日時:2002/04/14 12:40

「負数を2の補数形式で表現」という言葉は、数と、そのビット表現の対応関係を規定する言葉であり、ある1つの数についての言葉ではありません。


あるビット列の2の補数、という言葉と混同していませんか?

前者は
-1 <--> 11111B
-2 <--> 11110B
-3 <--> 11101B
...
という対応関係を示す言葉であり、後者は00101Bの1の補数は11010B、2の補数は11011B、
というように変換を表す言葉です。

言い換えれば、次のようになります。
整数とビット列との対応関係を決める、という問題があります。
正の数に関しては自然な対応(4と00100B、等)がありますが、負の数に関しては自然には対応しません。
そこで、「-1」倍の概念を決めれば、この対応を負の数にも拡張できる、という考え方を利用します。
いま、整数には「-1倍」という演算が自然に定義されていますが、ビット列にはそのようなものは自然には定義されません。
ビット列に対する「-1倍」をどう決めるか、というのが「負数を2の補数形式で表現」という問題文に現れているわけです。
つまり、「ビット列に対して、2の補数を取ることと、-1倍することを同一視します」と言っているわけです。

従って、10101Bの2の補数を取る、ということは、問題に与えられた数を勝手に-1倍する、ということですから、もちろんやってはいけません。
この場合、10101Bは-11を表しており、1の補数形式で表現すると10100です。
これは、10101Bの2の補数が01011Bであり、かつ01011Bが自然に11と対応づけられているからです。
上の言葉で言えば、-1倍したら(2の補数を取ったら)11になった、ということです。
これを1の補数表現のルールでビット列化したい場合には次のようにします。
-1倍のやり方が変わっていますが、あくまで表現したかった数は-11ですから、
11をビット列で表しておいてから「-1倍」する、ということになります。
11は01011Bです。この場合の「-1倍」とは、2の補数ではなく、1の補数ですから、10100Bとなります。

この回答への補足

詳しいご回答ありがとうございます。
ビット数が少ない私の頭で一生懸命理解に努めましたが、
理解できたかわかりません。以下に「こう理解しました」というのを補足しますので、
お時間ありましたらまた見ていただけますでしょうか?

【11 + (-11)】(これは10進です)を2進に直すと
【01010 + 10101】となるということですよね?
ということは、一度10進に直してから計算する場合は、
【10101】の方は2の補数を取って【-11】という値を求めますよね?
(一度10進に直す意味は聞かないで下さい(>_<)。癖になってるんです)

【01010】の方はこのまま10進に変換して【11】が出ますけど、
【10101】は、素直に10進にしたら【-5】という値になりませんか?
>「負数を2の補数形式で表現」という言葉は、数と、そのビット表現の対応関係>を規定する言葉であり、ある1つの数についての言葉ではありません。
ということですが、だとしたら、【01010】も【10101】も
2の補数への変換を、するのかしないのか、統一しなきゃいけないような
気がしているんです。【01010】はやらなくて【10101】はやる、
という差がわかりません。
問題文中の符号ビットが負数だったら、
変換してしまうという考えでいいのでしょうか?

せっかくご説明いただいたのにうまく理解できずにごめんなさい。
お手数おかけしますがよろしくお願いいたします。

補足日時:2002/04/14 13:02
    • good
    • 0

>問題文中の符号ビットが負数だったら、


>変換してしまうという考えでいいのでしょうか?
違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。
おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。

11010B=-11、という対応関係を見る際に2の補数を取っているのは、計算の便宜上のものであって、数自体を変換しているわけではありません。
x=10101Bがどの数に対応するのか、というのを調べる際には、次のように考えます。
但し、この議論は「負数を2の補数形式で表現する」場合の話です。
1.符号ビットが1なので、これは負の数として解釈しなければなりません。
2.ところが、負の数を表すビット列を直接数値に直すのは、慣れていないとなかなか難しい物があります。
3.そこで、-xがどの数に対応するのかが分かれば、xがどの数に対応するのかが分かる、というふうに考えます。
4.ビット列xから、-xを求めるには2の補数を取ればよいので、-x=01011Bとなります。
5.このビット列は11を表していますので、-x=11、が分かりました。
6.従ってx=-11です。
つまり、計算の過程で、計算の便宜上-xを算出するために2の補数を取って(-1倍して)いるに過ぎず、きちんと5→6の際に-1倍して元に戻しています。
数自体を変換しているわけではありません。

操作自体は理解されておられるようですから、あとは言葉の使い方の問題だと思われます。
一応、変換の手順を場合分けしておきます。(負数を2の補数で表現する場合)
・最上位ビット(符号ビット)が0のとき
素直に2進数を10進数に直せばOKです。
・符号ビットが1のとき
元の数をxとします。xを10進数に直すのは慣れが必要ですので、慣れのいらない場合に帰着させます。
つまり、-xを求めれば、それを-1倍してxを求められる、という考えをします。
xから-xを求めるには2の補数を取れば良いです。
こうして得られた結果は-xですから、最後に-1倍します。

ここで2の補数を取ってはいますが、後で-1倍するので、xの2の補数に対応する数を最終結果としているのではないことに注意してください。
つまり、この計算方法は「便宜上2の補数を利用している」のであって、「2の補数を取ったものを求めている」わけではありません。

次のようにも言うことができます。
・どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、ということはしない
・符号ビットが1の時には、2の補数=-1倍、という対応関係を計算の過程で利用する。つまり、2の補数を利用する
「2の補数を結果とする」と「計算過程で利用する」の言葉の違いを理解していただければ幸いです。
前者は「最後にマイナスを付ける」というニュアンスがありません。


ちなみに、負数を2の補数で表現する場合には、(オーバーフローしない場合には)10進に直してから足しても、ビット表現のままで2進数として足しても結果は同じになりますが、
負数を1の補数で表現する場合にはそのようなことは成り立ちません。
    • good
    • 0
この回答へのお礼

>どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、
>ということはしない
わかりました!計算上、自分が変換したものは、元に戻さないとだめなんですね。

確かにおっしゃるとおり、日本語的な理解の問題ですねー。
問題を解くことの前に、問題文の意味を理解する練習が必要かな。
でもあと一週間だし、あー・・・。
だけど2の補数の問題が出たら、頂いた回答を思い出して頑張ります(^o^)
ありがとうございました。

お礼日時:2002/04/14 17:39

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