• ベストアンサー

補数について教えてください!

情報処理技術者試験の内容なんですが、やり方も理解できず悩んでいます。教えてください。 その1. 2の補数を使って解きなさい   0110  -)0111 ------------ その2. 次の2進数は2の補数であらわした負の値である。符号付きの10進数に変換しなさい。  1) 1001  2) 1010  3) 1111  4) 1000 その3. 次の10進数を2の補数(4ビット)に変換しなさい。  1)-6  2)-3  3)-5  4)-4 本を見ながら解いているのですがいまいち理解できません。お手数お掛けしますが、解る方がいらっしゃいましたら解説付で教えてくださると助かります!よろしくお願いいたします!

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

 ビット反転、2進数の加算、10進数への変換は分かるものとして書きます。  まず「2の補数」ですが、例えば「ある数Aの2の補数」とは「Aを2進数で表して、全部の桁(ビット)を反転させたもの+1の値」になります。  で、なぜそんなものを使うのかというと、「コンピュータの中では、負の数を2の補数で表しているから」です。  つまり、ある数Aの2の補数とは「-A」のことで、「2の補数を求める」とは「符号を反転させる」ことなのです。 ※負の値は、10進数では-記号を数字の頭につけて表しますが、2進数では一番上(左)の桁が1なら負として表します。 ※ここまで、とても簡単に説明しているため、詳細は異なる部分もあります。  では問題の方を。 ■その1  2進数の「1001 - 0111」という計算ですが、これは「1001 + (-0111)」と書くこともできるので、まず0111の2の補数を求めて、それを1001と足せばよいのです。  加算の際、(0ビット目から数えて)4ビット目に繰り上がった値は捨て、結果に入れないで下さい。 ■その2  この問題は「-Aという形の10進数を、符号付2進数に変換してあるので、元の10進数に戻しなさい」というものです。  つまりAの2の補数が、既に求めてあるわけです。  従って、問題の値の2の補数を求めて10進数へ変換すればAが求まり、それに-記号をくっつけたのが答えになります。 ※2の補数で表された2進数には、通常の10進数への変換方法を使うことができません。 ■その3  これは問題2の逆ですね。-記号を取った値を2進数に変換し、2の補数を求めればOKです。  2進数に変換した時、どの値も2~3ビットで表せてしまいますが、頭に0を付け足して4ビットにしておいて下さい。それを全ビット反転させれば頭が1の2進数が求まりますよね。  以上、こんなものでどうでしょうか?分からなければ補足に書いて下さい。  一応、過去に補数に関して回答した時のものを、参考URLに載せておきます(No.4,5辺り)。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=82945
chikonojyo
質問者

お礼

よくわかります!(本にはなんでこういう細かいわかりやすいことがのっていないのか?と思います。)参考になりました!有難うございます!もうちょっとがんばってみます。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

すみません。  問題1の中で、「1001 - 0111」と書いてしまいましたが、これは「0110 - 0111」ですね。問題2-(1)と見間違いました。  というわけで、加算中に桁上がりすりこともありませんでしたね。  ついでに1個補足を入れておきますが、問題2-(4)の「1000」は、2の補数で表しても「1000」です。負数の2の補数を求めた場合、これは必ず正の数になるので、「1000」を素直に10進数に変換して、-記号をくっつけて下さい。  さらにもう1個、pythianさんが問題2の説明の中で >  補数を元に戻すには、1を引いて反転させるので、これは0111 とありますが、補数で表された値は、もう1度補数を求めれば元に戻りますので、やりやすい方を使って下さい。

  • pythian
  • ベストアンサー率32% (26/80)
回答No.1

2の補数は、簡単に言えばビットをひっくりかえして1を足すことで導けます。 0110 - 0111の場合、10進だと6-7ですよね。ここで7を補数にします。ビットを反転させて1を足すと1001になります。これで、1001は-7を表すことになりました。次に、0110+1001をやってみます。1111ですね。これは-1の補数表示です。逆の手順で、1を引いて反転させると0001になりましたね。つまり、演算結果は-1です。何故こんなややこしいことをするのか、簡単に言えば、足し算の機能だけで引き算をするためです。 1) 1001  補数を元に戻すには、1を引いて反転させるので、これは0111 2) 1010 -> 0110 3) 1111 -> 0001 4) 1000 -> 1000 となります。 10進の場合は、まず2進にしてから補数化します。 1)-6 6 -> 0110 -> 1001 -> 1010 2)-3 3 -> 0011 -> 1100 -> 1101 3)-5 5 -> 0101 -> 1010 -> 1011 4)-4 4 -> 0100 -> 1011 -> 1100 ・・・間違いがあればバシバシ突っ込んでください。(^^; 補数を使えば、二進数で負の数を表すことができるようになります。そのまま足せば減算ができるんですね。ただし、限られたビット長で負を表すので、表すことの出来る正の数は半分になります。たとえば、8ビットだった場合、そのままなら256まで表せられますが、補数を使うと-128~127までになります。

chikonojyo
質問者

お礼

有難うございます。。難しいですねぇ。。それにしても。教えてもらったことをもう一度確認しながらがんばってみます!有難うございました!

関連するQ&A

  • 補数を利用した引き算について

    こんにちは。 『2進数で 111 - 010 を計算をせよ。』 という問題があります。 つまり10進数でいう所の 7 - 2 = 5 の計算をします。 補数を利用すると引き算が足し算ででき、演算が簡単になることを 本は説明しようとしてるのですが、腑に落ちない点があります。 解説では --------------------------------- 引く数 010 の補数を求めると 101 なので  111 +101 -------- 1101  ↓  101 よって桁上がりを無視した 101 が答え --------------------------------- との事ですが疑問に思うことがいくつかあります。 I. 上記の計算では3ビットであることが前提になっています。 7 - 2 = 5 をしたいわけですから、そうすると  111 ←符号なしの表現 ( 7 ) +101 ←符号付きの表現 ( -2 ) -------- 1101  ↓  101 ←符号なしの表現 ( 5 ) となり、符号なしと符号付きの数値を混ざってしまうが、良いのでしょうか? また、この説明の仕方だと答えが 0~7 になる答えしか出せません。つまり引く数の方が大きいと計算できません。 私は補数を使うのであれば正の値・負の値、全て符号付きの値でなければいけないと思っていたので、 もし私が説明するのであれば全て符号付きにし、そして符号付きで7を表せるようにするために4ビットにして  0111 ←符号付き( 7 ) +1110 ←符号付き( -2 ) ---------- 10101  ↓  0101 ←符号付き( 5 ) とするのであれば納得できます。 答えの範囲も -8~7 と負の値も許容できます。 II. 実際には 本のように引く数だけを補数にして足し算をして答えを求めているのか、 それとも私のように正の値・負の値、ともに符号付きの表現にして足し算をしているのか、 もしくは、いずれとも違うのか、どうなのでしょうか? また、参考文献などがありましたらご紹介お願いします。 以上ですがよろしくお願いします。

  • 2の補数の計算について

    C言語のプログラム中で得られた10進数の値を,固定長16ビットの2進数に変換したいと考えています. しかしながら,得られた10進数の値が負数であった場合,それを負数と判断し,2の補数として出力したいのですが,なかなかいい方法が思いつきません… 例えば処理中で -1.915098 といったような10進数の値を2進数に変換し,先頭の1ビットが正負符号の2の補数として表現するためにはどのように記述すればよいでしょうか? 簡単で構いませんので,記述例も書いていただけると助かります…

  • 2の補数について

    情報処理試験(基本情報)用の考え方という前提でお聞きします。 「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。 この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします) として記述されているものは、もう2の補数になっていると考えていいのでしょうか? それともこれを、今から2の補数に直すのですか? (もし直すのであれば、最上位ビットの符号が変わるのでしょうか?) 違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、 「-A」の2の補数は「A」になるんでしょうか? それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という ことになるのでしょうか? 解りにくくてすみません。

  • 1の補数表現

    昔の本を買って情報処理の勉強をしているのですが ふに落ちない事がありまして質問させていただきます。 符号付の整数を8ビットの2進数であらわす時、1の補数表現で最小の数は-128である。 と言う問題がありまして回答が正しいとなっていました。 しかし自分は-127までしか表現できないと思いまして。。。 2の補数表現なら-128~127まで表現できると思うのですが 1の補数表現なら-127~127までしか表現できないと思います。 詳しい方がいましたらよろしくお願いします。

  • 2の補数の問題

    お世話になります。 初歩的な質問で申し訳ございませんが、質問させてください。 ------------------------------------------------------------- 問:負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示したもののうち、4倍するとあふれが生じるものはどれか。 ア 1FFF イ DFFF ウ E000 エ FFFF ------------------------------------------------------------- 答えはイなのですが、イマイチです。 とある解説だと、4倍すると符号が変わるものがあふれとのことでした。 DFFF →(2の補数)0010 0000 0000 0001 →(4倍する)1000 0000 0000 0100 確かに符号が変わることは分かるのですが、ウでも E000 →(2の補数)0010 0000 0000 0000 →(4倍する)1000 0000 0000 0000 こちらも符号が変わることにはならないのでしょうか? どうぞよろしくお願いいたします。

  • 補数について質問です。「次の10進数を8ビットの2の補数に変換せよ」(

    補数について質問です。「次の10進数を8ビットの2の補数に変換せよ」(1)-111 まず絶対値をとり111にする。次に111を2進数で表す。0001 0001 0001となりますが、8ビットの2の補数に直すため0001 0001 0001の部分は8桁にしなくてはいけませんが、12桁になってしまいます。こういう場合どうすればいいのですか?

  • 補数ということばの意味

    補数ということばの意味 正確には計算機科学の質問なのですが、カテゴリがないのでここに質問しました。 コンピューターで負の数を表すときに、補数表現を使うことがあります。二進数の負の数を表すときに、"1の補数で表す"というときにはビット反転を行い、"2の補数で表す"というときにはビット反転プラス1を行うということはわかるのですが、"1の補数"や"2の補数"ということばの意味がわかりません。何で、"1の"とか"2の"というのですか?

  • 2進数の補数表示について

    よろしくお願いします 「負の数(-128)を8ビットの2の補数表示するとき、どうなるか?」 の問題で、わからない箇所があります。 1.最上位ビットは正・負を表す。 2.負の数:-127を2の補数を使用して表現する。    (例)-1(10)==>    まず、正で考える。      ==> 0000 0001(2)      「確認」 1111 1110(反転)            +1(プラス1) ---------- 1111 1111(2)(答え) -127(10)      ==>0111 1111(2)  まず、正で表す。    「確認」        1000 0000(反転)           +1 (プラス1) ---------- 1000 0001(答え) ここからが疑問なんです。    -128(10)の場合      ==>1000 0000(2) まず、正で考える。    「確認」        0111 1111(反転) +1 (プラス1)       -----------      1000 0000(2)(答え) ↑ ・答えがプラスの128(10)=>10000000(2)と同じではない  でしょうか? ・このときの最上位ビットは桁上がりの「1」と正負の違  いを表す「1」のどちらを表しているのですか? ・たとえば「負数を2の補数で表すとき,8ビットで  表現できる整数の範囲は10進数でどれか。」など  の問題で答えが正の127は理解できるのですが、  負は「-128」ということがよくわかりません。 一応検索をしてみましたが、類似回答では理解できませんでした。よろしくお願いします。        

  • 浮動小数点の問題です。

    10進数+0.375を浮動小数点で記憶させ、その記憶領域のダンプリストを読み取ると、 0.375は16進数で(1)に、 -1は16進数で(2)となる。 答えは(1)は7F00、(2)8600です。 この2つの問題の途中式と解説をお願いします。 バイト型:バイト数は1バイト,負の補数は2の補数で表す 整数型:バイト数は2バイト,負の補数は2の補数で表す 浮動小数点:バイト数は2バイト,符号1ビット,指数部5ビット,仮数部10ビット ビット番号0:符号部.仮数部の符号が入っている.0なら正,1なら負 ビット番号1-5:指数部.負の値を2の補数で表す ビット番号6-15:仮数部.ビット番号6を小数点第1位とする仮数部の小数点以下の絶対値が、正規化された2進数で入っている 正規化とは,仮数部が2進数で0.1以上1.0未満になるよう指数部を増減する操作である

  • 2進数の掛け算ができません

    初めまして。2進数の掛け算で困っています。よろしくお願いします。 10進数で2*(-3)=-6ですが、これを3bitの2進数で行ないたいと思います。 すると、010*101(2の補数)=01010となります。 -6は10(2の補数)となるはずですが答えが異なります。 符号拡張というものがあるということで、次はそれで行なってみます。 010*1101(符号を拡張した2の補数)=011010となります。 答えが異なります。ますますわけがわかりません。 ---------- 次に10進数で(-1)*(-1)=1ですが、これを2bitの2進数で行ないたいと思います。 すると、11(2の補数)*11(2の補数)=1001となります。 1は1となるはずですが答えが異なります。 符号拡張というものがあるということで、次はそれで行なってみます。 111(符号を拡張した2の補数)*111(符号を拡張した2の補数)=110001となります。 答えが異なります。ますますわけがわかりません。 ---------- 話は変わるのですが、 Nビット×Mビット=N×Mビットになる とのことです。これも理解できません。 どなたかご教授をお願いしますm(__)m

専門家に質問してみよう