情報処理試験(基本情報)用の考え方という前提でお聞きします。
「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。
この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします)
として記述されているものは、もう2の補数になっていると考えていいのでしょうか?
それともこれを、今から2の補数に直すのですか?
(もし直すのであれば、最上位ビットの符号が変わるのでしょうか?)
違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、
「-A」の2の補数は「A」になるんでしょうか?
それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という
ことになるのでしょうか?
解りにくくてすみません。
No.3ベストアンサー
- 回答日時:
>問題文中の符号ビットが負数だったら、
>変換してしまうという考えでいいのでしょうか?
違います。計算過程で一時的に変換を行うのか、と言われればその通り、ということになりますが。
おそらく、手順としては正しく理解されており、言葉の用法が正しくないと思われます。
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の補数で表現する場合にはそのようなことは成り立ちません。
>どんな場合でも与えられた数の2の補数を取ったものを求めて最終結果とする、
>ということはしない
わかりました!計算上、自分が変換したものは、元に戻さないとだめなんですね。
確かにおっしゃるとおり、日本語的な理解の問題ですねー。
問題を解くことの前に、問題文の意味を理解する練習が必要かな。
でもあと一週間だし、あー・・・。
だけど2の補数の問題が出たら、頂いた回答を思い出して頑張ります(^o^)
ありがとうございました。
No.2
- 回答日時:
「負数を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】はやる、
という差がわかりません。
問題文中の符号ビットが負数だったら、
変換してしまうという考えでいいのでしょうか?
せっかくご説明いただいたのにうまく理解できずにごめんなさい。
お手数おかけしますがよろしくお願いいたします。
No.1
- 回答日時:
符号付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回繰り返すと元の値になります。
ご回答ありがとうございます。
2の補数は必ずしも、符号ビットが負数(1)とは限らないということですね。
そうなるとやっぱり、いったいどれが2の補数に変換してあって、
どれがしてないというのが、解らない・・・。
単純に「次の数の2の補数を求めなさい」という問題が出てくれることを
期待します。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
O(n log n)について2
-
16進数 加算 減算 C言語
-
c languageで 簡単な質問があ...
-
除算を使わずに10で割りたい。
-
ExcelでPC(パソコン)によって...
-
VB.net Double と...
-
VB6.0での小数点の扱いについて
-
最大50桁の実数の和・差・積を...
-
有効桁数の数え方・誤差
-
VBAでミリ秒まで出力する方法
-
変換指定子%22-16gの表示...
-
C#にて電卓を作りたいのですが...
-
【C言語】RGBと輝度の計算に関して
-
10進数での「25」が2進数では「...
-
C言語でπを2万桁まで計算するには
-
距離から緯度経度を求める方法
-
C言語でセルオートマトンを作成...
-
EXCELで 0.1 はなぜ 0.1 となる...
-
EXCELの関数"STDEV(標準偏差)"...
-
三菱シーケンサ(Aシリーズ)で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
ExcelでPC(パソコン)によって...
-
16進数 加算 減算 C言語
-
ExcelのINT関数の計算結果がお...
-
EXCELの関数"STDEV(標準偏差)"...
-
三菱シーケンサ(Aシリーズ)で...
-
VB.net Double と...
-
除算を使わずに10で割りたい。
-
有効数字について 以前質問をし...
-
BCD・HEX・BINについて
-
C言語でセルオートマトンを作成...
-
VB6.0での小数点の扱いについて
-
VBAでミリ秒まで出力する方法
-
2進数の足し算(C言語)
-
”/”を使わずに割り算したいんで...
-
floatの有効桁数
-
計算の丸め誤差の解消について
-
VB6のFIX関数での誤差について
-
三角比の俯角の計算
おすすめ情報