基本情報技術者試験的な備忘録(2の補数)

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進数で何なのか分からない。

 

 

あと、pythonVBAでもやってみたいが・・・時間がない。

 

 

追記
全然関係ないが、ビット(桁)とビットパターン(通り)は違う。
4ビット(桁)なら、□□□□
でも、ビットパターン(通り)だと16。
桁の重みだと先頭ビットは8(8/4/2/1)なので、8ビットとか勘違いしてしまう。違うか。