
情報処理技術者試験の内容なんですが、やり方も理解できず悩んでいます。教えてください。
その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
本を見ながら解いているのですがいまいち理解できません。お手数お掛けしますが、解る方がいらっしゃいましたら解説付で教えてくださると助かります!よろしくお願いいたします!
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
よくわかります!(本にはなんでこういう細かいわかりやすいことがのっていないのか?と思います。)参考になりました!有難うございます!もうちょっとがんばってみます。
No.3
- 回答日時:
すみません。
問題1の中で、「1001 - 0111」と書いてしまいましたが、これは「0110 - 0111」ですね。問題2-(1)と見間違いました。
というわけで、加算中に桁上がりすりこともありませんでしたね。
ついでに1個補足を入れておきますが、問題2-(4)の「1000」は、2の補数で表しても「1000」です。負数の2の補数を求めた場合、これは必ず正の数になるので、「1000」を素直に10進数に変換して、-記号をくっつけて下さい。
さらにもう1個、pythianさんが問題2の説明の中で
> 補数を元に戻すには、1を引いて反転させるので、これは0111
とありますが、補数で表された値は、もう1度補数を求めれば元に戻りますので、やりやすい方を使って下さい。
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までになります。
有難うございます。。難しいですねぇ。。それにしても。教えてもらったことをもう一度確認しながらがんばってみます!有難うございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 計算機科学 ビット計算 2 2023/04/16 14:26
- 数学 【 数Ⅰ 2次関数 】 問題 関数y=mx²+4x+m-3において,yの値が 常に負であるという条件 2 2022/10/01 15:08
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 数学 数学の質問です。 関数f(t)のフーリエ変換をF(ω)=∫[-∞→∞]f(t)exp(-iωt)dt 1 2023/07/29 01:08
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- 数学 フーリエ変換後の負の周波数成分の扱いについて 4 2022/09/03 10:18
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- 数学 x^4-2x^2+16x-15=0 という因数分解の答えが、 (X-1)(X+3)(X^2-2X+5 4 2022/05/15 16:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進コード文字列を文字列に変換
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
WORD型をCString型に変換する方法
-
CString型 全角半角を意識せず...
-
vbaで出来ますか?
-
【excelマクロ】重複をチェック...
-
VB上でのレコードセットの扱い...
-
VBAでMODE関数をつくる
-
C#でbyte配列から画像を表示さ...
-
Dir関数で読み取り順を操作でき...
-
アクセステーブル、リンクとロ...
-
★クリスタルレポートの元になる...
-
コミットとは何でしょうか?
-
ACCESS2000 INPUTBOX でテーブ...
-
COBOL数値転記の仕様
-
vba フィルター 複数条件 3つ以...
-
Access クエリで変数を参照する...
-
配列の格納方法
-
コンボボックスのインデックス...
-
複数の配列変数を1つの配列変数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6.0の「vbFromUnicode」はVB....
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
16進をASCIIコードに変換する...
-
WORD型をCString型に変換する方法
-
10進数を2進数
-
C#で文字列を数値に変換する方法
-
16進コード文字列を文字列に変換
-
VC++ std::stringからLPCWSTRに...
-
【C++/CLI】int型からString型...
-
Boolean型変数の値を反転する方法
-
型変換について (C++ Builder5)
-
文字型を日付/時刻型に変換する...
-
textbox.textやlabel.captionの...
-
ASPでVBのFormat関数のような機...
-
VB6.0 String型→Long型変換方法...
-
Excelの数字(文字列)合計につい...
-
2進数から10進数へ変換
-
vb6の桁数指定
-
n進数の値を10進数の値に変換す...
-
数字→漢数字変換
おすすめ情報