8ビットの値の全ビットを反転する方法(操作)は、16進表記 FF のビット列と排他的論理和をとることです。
ためしに01010101の8ビットを適当に作って、16進数のFF=10進数の255=2進数の11111111と、排他的論理和をとると。
01010101(→もと)
11111111(→16進数のFF)
————
10101010(→排他的論理和)
みごとに、8ビットの全ビットが反転された結果となります。
この1行を丸暗記すれば、基本情報技術者試験の「令和元年秋期午前問2」は回答できるといえば、それまでですが、せっかくなら理屈も覚えたってください。
8ビットの値の全ビットを反転する方法は?
8ビットの値の全ビットを反転する方法は、冒頭にも書いた通りなのですが、せっかくなら覚えておくべき知識がたくさん。
「知ってるよ」という人は、適当に飛ばしてください(*´▽`*)。
【予備知識】ビットは0と1のかたまり
まず、1つ目の知識として、「ビットとはなんぞや?」というお話。教科書的な説明はわかりませんが、ビットの意味を直接聞かれることは、ほぼ、ないです。
ひとまず、「ビットは0と1のかたまり」、スイッチのON/OFFのイメージと思えばOKです。
【予備知識】16進数を10進数に変換
16進数を10進数に変換するには、さらに2つの知識が必要。
- 16進数の1~F→10進数の1~15であること
- (16進数のn桁目を10進数に変換×16^n-1桁)
+(16進数のn-1桁目を10進数に変換×16^16進数のn-2桁)
+・・・+(16進数の1桁目を10進数に変換^16進数の1桁)を繰り返す
たとえば、16進数のABCを10進数に変換する場合。
16進数のAは10、Bは11、Cは12なので、下記の通り。
16進数のABC=10×16^(3-1桁)+11×16^(2-1桁)+12×16^(1-1桁)
=10×16^2+11×16^1+12×16^0
=2560+176+12
=2748
【予備知識】10進数から2進数に変換
ちょうど上で出した、2748を2進数にしてみましょう。
10進数から2進数に変換するには、こんな感じの割り算をします(計算めんどいので、実際には2748より小さい値で出題されるはず)。
2748÷2=1374あまり0(ここまであまりを書く)
1374÷2=687あまり0
687÷2=343あまり1
343÷2=171あまり1
171÷2=85あまり1
85÷2=42あまり0
42÷2=21あまり1
21÷2=10あまり1
10÷2=5あまり0
5÷2=2あまり1
2÷2=1あまり0
1÷2=0あまり1(ここから順に)
わり算の商が0になるまでくりかえして、下から順番にわり算のあまりを書き上げていきます。
つまり、101011011100と書けば、あら不思議。2進数の完成です。
【予備知識】排他的論理和は自分だけが1なら1、それ以外は0になる
そして、排他的論理和は自分だけが1なら1、それ以外は0になります。
A | B | 排他的論理和(XOR) | 考え方 |
---|---|---|---|
1 | 1 | 0 | AかつB |
1 | 0 | 1 | Aだけ |
0 | 1 | 1 | Bだけ |
0 | 0 | 0 | AでもBでもない |
Aだけが
8ビットのかたまりを適当に作って、16進数のFFで反転して終わり
ためしに8ビットのかたまりを適当に作ってみます。ここでは、01010101と仮定。
これにたいして、16進数のFF=10進数の255=2進数の11111111と、排他的論理和をとると。
01010101(→もと)
11111111(→16進数のFF)
————
10101010(→排他的論理和)
8ビットの全ビットが反転されます。8ビットが何であれ、16進数のFFの排他的論理和をとれば完成です。
全ビットを反転するには、同じビット数のすべての値が1の排他的論理和をとる
ちなみにですが、全ビットを反転するには、同じビット数のすべての値が1の排他的論理和をとればよし。
5ビットなら5ビットすべての値が1の排他的論理和をとる
例えば、5ビット01010の全ビットを反転したいときに、同じ5ビットのすべての値が1の排他的論理和をとると。
01010(→もと)
11111(→同じビット数で値がすべて1)
——-
10101(→排他的論理和)
となるので、やはり全ビットを反転することができます。
ちなみに、2進数の11111は10進数の31、16進数に直すと1Fなので、「16進表記の1Fの排他的論理和」をとればいいわけ。
本質は、排他的論理和と進数の変換を知っているか?
そして、「同じビット数のすべての値が1の排他的論理和をとる」みたく、わざわざ暗記しなくても
- 排他的論理和を知っているか?
- 16進数→10進数の変換ができるか?(あるいは10進数→16進数)
- 10進数→2進数の変換ができるか?(あるいは2進数→10進数)
がわかっていれば、その場で答えを出せます。1問でいろんな知識を問えるわけですね(*´▽`*)。
まとめ
8ビットの値の全ビットを反転する方法(操作)は、16進表記 FF のビット列と排他的論理和をとることです。
そこから、いろいろと書きましたが、できれば「その場で答えを出す」ようにして。
他のことを暗記したほうがいいと思ったりしたわけです(-_-;)。
コメント