こんばんは。あんみつです。
今日はビット演算について簡単にまとめました。
(ついでにC言語のビット演算子についても載せました)
目次
演算子の種類
NOT(否定)
各ビットの反転です。
入力 | 0 | 1 |
出力 | 1 | 0 |
例)NOT 0101 = 1010 です。
AND(論理積)
ふたつ以上のビットの積を取ります。
入力1 | 0 | 0 | 1 | 1 |
入力2 | 0 | 1 | 0 | 1 |
出力 | 0 | 0 | 0 | 1 |
例)0101 AND 0111 = 0101 です。
OR(論理和)
ふたつ以上のビットの和を取ります。
入力1 | 0 | 0 | 1 | 1 |
入力2 | 0 | 1 | 0 | 1 |
出力 | 0 | 1 | 1 | 1 |
例)0101 OR 0111 = 0111 です。
XOR(排他的論理和)
ふたつ以上のビットの1の数が奇数個のときに1、偶数個のときに0を取ります。
入力1 | 0 | 0 | 1 | 1 |
入力2 | 0 | 1 | 0 | 1 |
出力 | 0 | 1 | 1 | 0 |
例)0101 XOR 0111 = 0010 です。
シフト演算
左シフト
ビット列を左側に指定桁数分シフトさせます。
空いた右側のビットには0が入ります。
10101111を2ビット左シフトすると、
10111100になります。
右シフト
ビット列を右側に指定桁数分シフトさせます。
空いた左側のビットには、unsignedの場合は0、signedの場合は計算機によって0が入る場合(論理シフト)と1が入る場合(算術シフト)があり注意が必要です。
10101111を2ビット右シフトすると、
00101011(論理シフト)ないしは11101011(算術シフト)になります。
C言語のビット演算子
C言語でのビット演算子の記述方法をまとめておきます。
種別 | 演算子 | 記述例 | 意味 |
NOT | ~ | ~a | aの反転 |
AND | & | a & b | aとbのAND |
OR | | | a | b | aとbのOR |
XOR | ^ | a ^ b | aとbのXOR |
左シフト | << | a << b | aをbビット分、左にシフト |
右シフト | >> | a >> b | aをbビット分、右にシフト |
過去問(ビット演算)
ビット演算に関する基本情報の過去問です。
今回は計算もあり若干ややこしいので2問紹介します。
H25年秋 午前 問2
答えは、、、
「ア」です。
まず32ビットのレジスタに16進数のABCDが入っているとはどういうことか、書き出してみましょう。
00000000 00000000 10101011 11001101
A = 1010
B = 1011
C = 1100
D = 1101
ですね。
これを2ビット右に論理シフトするので、
00000000 00000000 00101010 11110011
になります。
この値を16進数にすると、「2AF3」なので「ア」となります。
0010 = 2
1010 = A
1111 = F
0011 = 3
ここで、勘の良い人ならなぜ問題文が「32ビットのレジスタ」になっているのかわかったかもしれません。
上述した、右シフト時に左側のビットに1を入れるのか0を入れるのかの問題を論点から外したいからです。(だと思われます)
32ビットのレジスタに16進数のABCDが入ってるだけということは、
左から16ビット(全体の半分)は0で埋められているので、右にシフトしたときに入り得る値は0で確定しますから。
次の例題もそうですが、ビット演算の問題文は前置きに一瞬とまどうケースがありますので、
深読みせずにまずはビットを書き出してみることをオススメします。
今回の問題も、32ビットの意味やレジスタという言葉が仮にわからなくても正解にはたどり着けます。
H26年春 午前 問2
答えは、、、
「ウ」です。
パリティビットとは誤り訂正に用いる上位1ビットのことですが、1つ目の例題と同様に、そこは本質ではないので一旦意味を無視しましょう。
8ビットあるうちの下位7ビットを取るためには、
*●●●●●●●
の●の部分が1なら1、0なら0になる演算をすれば良いです。
つまり、
01111111とANDを取ることで下位7ビットのみを取り出すことができます。
(上位1ビットだけが必ず0になります)
01111111は16進数で「7F」なので、答えは「ウ」になります。
ちなみに、すぐに01111111だということが導けなくても、
慌てずに一つ一つ当てはめてみることでも正解にたどり着けます。
「ア」の0FとのANDでは下位4ビットしか取り出せません。
「イ」の0FとのORでは下位4ビットが必ず1になってしまいます。
「エ」のFFとのXORはややこしいですね。
ややこしいですが、演算元のビットが0なら1、1なら0と反転してしまいますのでこれも不正解です。
おわりに
いかがでしたでしょうか。
ビット演算もANDやOR程度であれば単純ですが、XOR(排他的論理和)あたりからややこしくなってきますね。
最後にいつも通り基本情報技術者試験の対策本で標準的なものを紹介しておきます。
なお、当ブログのカテゴリ「情報処理」で絞っていただくと基本情報に関する記事がまとめて読めますので、
よろしければ他の記事もご覧ください。