情報処理試験(基本情報)用の考え方という前提でお聞きします。
「負数を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で質問しましょう!
似たような質問が見つかりました
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 計算機科学 6ビット(符号含む)の二進数 4 2023/04/16 13:22
- 計算機科学 ビット計算 2 2023/04/16 14:26
- その他(データベース) 4進数風なバーコードは何ですか? 2 2022/11/28 23:33
- Java Java 配列<選挙> 4 2023/07/31 15:07
- 高校 三次関数のグラフにつきまして 3 2022/05/15 11:14
- 統計学 t分布導出時のヤコビ行列式について教えて下さい。 1 2022/07/04 21:36
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c languageで 簡単な質問があ...
-
VB.net Double と...
-
O(n log n)について2
-
EXCELの関数"STDEV(標準偏差)"...
-
ExcelのINT関数の計算結果がお...
-
”/”を使わずに割り算したいんで...
-
CASLIIの質問です。
-
巨大な階乗の桁数を求めるプロ...
-
三菱シーケンサ(Aシリーズ)で...
-
時刻の比較
-
16進数 加算 減算 C言語
-
教えて小数点の比較!(C言語)
-
MS-VisualStudio 2003と2005(マ...
-
VBAでミリ秒まで出力する方法
-
BCD・HEX・BINについて
-
色の判定
-
CRCの計算方法について
-
VB6.0での小数点の扱いについて
-
大きすぎる数値になるとE+にな...
-
Log関数に関する質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.net Double と...
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
有効数字について 以前質問をし...
-
ExcelのINT関数の計算結果がお...
-
三菱シーケンサ(Aシリーズ)で...
-
VBAでミリ秒まで出力する方法
-
16進数 加算 減算 C言語
-
ExcelでPC(パソコン)によって...
-
時刻の比較
-
除算を使わずに10で割りたい。
-
計算の丸め誤差の解消について
-
VB6.0での小数点の扱いについて
-
”/”を使わずに割り算したいんで...
-
EXCELの関数"STDEV(標準偏差)"...
-
BCD・HEX・BINについて
-
2038年問題 日付算出
-
2進数の足し算(C言語)
-
VBAのINT関数について
-
どんな数字を入力してもaverage...
おすすめ情報