20320417基本情報技術者試験的な備忘録(2の補数)
パソコン素人です。
プログラム素人です。
基本情報技術者試験の問題・テキスト等を見て気になったメモです。
多分間違っているのであまり見ないで下さい。すみません。(解説ではありません)
https://www.ipa.go.jp/news/2022/shiken/tsunen.html
「出典:基本情報技術者試験(科目A試験) サンプル問題セット」
「出典:基本情報技術者試験(科目B試験) サンプル問題セット」
「2の補数」が分からない。
分かったようで分かってなかった。
2の補数表現は、「ビット反転して1を加える」と参考書にある。
でも、そもそも「補数」と「2の」補数表現が何者なのか分からないとつらい・・・。
書いててもよく分かっていない・・・。
参考サイト:
Zenn様(感謝) 「Python3での2の補数と~演算子(ビット反転)
具体例で学ぶ数学様(感謝)2の補数、1の補数の意味と負数の変換方法
●補数とは・・・補数はいっぱいある。1の補数とか2の補数とか10の補数とか・・・
(注:桁上がりはまだ考えない)
(注:符号もまだ考えない)
基数の補数:
・・・10進数なら「10の補数」
・・・2進数なら「2の補数」というのがある。
が、2進法の世界で、0と1を反転させたものを「1の補数」というのもあるらしい。
まず、(2進法の)「1の補数」の理解が必要らしい・・・。
●(2進法の)1の補数・・・0と1を反転させたもの(ビット反転)
例:
1011の1の1の補数は、0100
10100100の1の補数は、01011011
(注:桁上がりはまだ考えない。
けど、上記を足し込むんでも桁上がりしない。足してみるとちょうど111並びになる。
★妄想。。。多分2進法で1の補数は、桁上がりしない最大の数字な気がする・・・。)
●(2進法の)2の補数・・・2進法で、0と1を反転させて、1を加えたものを「2の補数」という。
例:
1011の2の補数は、反転させたもの0100に1を加え、0101
10100100の2の補数は、反転させたもの01011011に1を加え、01011100
●(2進法の)2の補数の使い方=負の数の表現を8ビットなど整数で表す
(8ビットなら、-128から127の整数で表す)
★妄想。。。2進法で、1の補数(その桁の最大数)と2の補数(桁上がり)があるなら、
同じように10進法では、9の補数と10の補数があるのだろう。。。そう整理すると納得しやすい。
●負の数(2進法)のコンピュータでの書き方
左端の先頭ビットが「1」だと負の数を表す。(pythonなど少し違う)
これをすることで、マイナス記号を使わずに、負の数を表現する。
(引き算を足し算で表現できるということだそうな←ピント来ない)
●負の数の実例(4ビット)
2進数 10進数 10進数
4ビット 符号つき 符号なし
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 -8 8
1001 -7 9
1010 -6 10
1011 -5 11
1100 -4 12
1101 -3 13
1110 -2 14
1111 -1 15
うーん。4ビットだと、7から-8まで表すことができる。16通り。
でも、2進数1000が10進数-8だとは直感的に理解できない・・・。
例題1
ためしにやってみる・・・-8(人間・10進法)
これは、
-8(人間・10進法)
↓
8(*-1変換)
↓
1000(コンピュータ・2進法)
↓
0111(2進法の1の補数・ビット反転)
↓
1000(上記に1を加える)※4桁目これでいいのか?
ためしにやってみる・・・-6(人間・10進法)を8ビットで表現するには?
これは、
-6(人間・10進法)
↓
6(*-1変換)
↓
0110(コンピュータ・2進法)
↓
1001(2進法の1の補数・ビット反転)
↓
1010(上記に1を加える)※4桁目これでいいのか?(これはいいのかな)
★妄想。。。人間・10進法の負の数を2進法の2の補数表現しようとすると、
正の数の桁の重み(8/4/2/1)とかと見た目違っているのでややこしい。
(上記でも-6を置き換えられるように*-1で6にしてややこしい。)
例題2
ためしにやってみる・・・11111010は10進法で何?
11111010(先頭ビットが1なので負の数と考える)
↓
00000101(2進法の1の補数・ビット反転)
↓
00000110(上記に1を加える)
これは、10進法で-6だそうです。(ややこしい)
https://www.ipa.go.jp/news/2022/shiken/tsunen.html
「出典:基本情報技術者試験(科目A試験) サンプル問題セット」
問1
これの意味は、2進数8ビットの整数nを-nに変換するにはどうすればいいか。
例えば、10進数で「6」を「-6」にするには?と読み替えていいと思う。
「6」を2進数の整数(2進正数)で表すと、0000 0110
まず、これを(2進法の)1の補数でビット反転するのは、
n xor 1111 1111です。
0000 0110
1111 1111(排他的論理和・ビット反転)
↓
1111 1001
↑
次に(2進法の)2の補数にするには、ビット反転したものに1を加える。
↓
1111 1010
こうすると、-6になる。
(面倒なので変換ツールで確認したところ、1111 1010は-6で合ってました。)
まとめ:
2進数で負の数字を表現(マイナスを使わない)しようとすると、
ちょっと見、2進数のマイナスの数字は、10進数で何なのか分からない。
あと、pythonやVBAでもやってみたいが・・・時間がない。
追記
全然関係ないが、ビット(桁)とビットパターン(通り)は違う。
4ビット(桁)なら、□□□□
でも、ビットパターン(通り)だと16。
桁の重みだと先頭ビットは8(8/4/2/1)なので、8ビットとか勘違いしてしまう。違うか。