hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
AND演算子は条件が全て「真」となるときに「真」となる演算です。
日本語では「かつ」に相当します。
例えば
○が「真」で□が「真」のとき
○ AND □ は「真」となり
○が「真」で□が「偽」のとき
○ AND □ は「偽」となります。
表にして見てみると...
○ | □ | ○ & □ |
真 | 真 | 真 |
真 | 偽 | 偽 |
偽 | 真 | 偽 |
偽 | 偽 | 偽 |
となり、共に「真」の場合だけが「真」となるのがわかると思います。
学校の数学で集合を勉強されている方は、 積集合をイメージするとわかりやすいでしょう。
「真」・「偽」
正しいことを真、そうでないことを偽と言います。
たとえば…
1 < 2
↑これは式が成り立っていて正しいので真です。
じゃあ、↓これはどうでしょうか?
1 = 2
式が成り立っていませんね。正しくないので偽になります。
この真偽という考え方は、後ほど条件分岐(if命令など)で必要となってきます。
OR演算子は条件が一つでも「真」となるときに「真」となる演算です。
日本語では「または」に相当します。
例えば
○が「真」で□が「真」のとき
○ OR □ は「真」となり
○が「真」で□が「偽」のとき
○ OR □ は「真」となります。
表にして見てみると...
○ | □ | ○ | □ |
真 | 真 | 真 |
真 | 偽 | 真 |
偽 | 真 | 真 |
偽 | 偽 | 偽 |
となり、一つでも「真」の場合「真」となるのがわかります。
学校の数学で集合を勉強されている方は、 和集合をイメージするとわかりやすいでしょう。
XOR演算子は条件のうち一つだけが「真」となるときに「真」となる演算です。
これも日本語では「または」に相当します。
例えば
○が「真」で□が「真」のとき
○ XOR □ は「偽」となり
○が「真」で□が「偽」のとき
○ XOR □ は「真」となります。
表にして見てみると...
○ | □ | ○ ^ □ |
真 | 真 | 偽 |
真 | 偽 | 真 |
偽 | 真 | 真 |
偽 | 偽 | 偽 |
となり、条件のうち一つだけが「真」となるときに「真」となるのがわかります。
学校の数学で集合を勉強されている方は、 和集合から積集合を引いたものであるとイメージするとわかりやすいでしょう。
上の3つの演算子(AND OR XOR)は具体的になにをしているんでしょう??
この3つは共に2進数で考えます。
2進数は右から順に2の0乗,1乗,2乗,3乗・・・(1 ,2, 4, 8・・・)となります。
よって、10進数の2は
2進数で 0000 0010
これは、10進数の2は2の1乗、0乗は右から2番めに1を立てることより0000 0010となります。
同じように、10進数の3は
2進数で 0000 0011
これは2の0乗+2の1乗で3、0乗は右から1番め、1乗は2番めを立てるので0000 0011となります。
では、AND演算(真と真のとき真)を10進の2と3でやってみると
0000 0010 0000 0011 --------- 0000 0010
となり、2ビット目がともに1(真)なので結果も1となります。1ビット目も同じ考え方です。
よって 2 & 3 は 2 となります。
同じようにOR演算子(一つでも真なら真)を2と3でやってみると
0000 0010 0000 0011 --------- 0000 0011
となり、真のビットは1番めと2番目なので、1、2番目に1が立ちます。
よって 2 | 3 は 3 となります。
同じようにXOR演算子(一つだけ真なら真)で2と3でやってみると
0000 0010 0000 0011 --------- 0000 0001
となり、2ビット目は2つ真なので偽となり、1ビット目は1つが真なので1ビット目に1が立ちます。
よって 2 ^ 3 は 1 となります。
NOT演算子とはビットの反転で NOT( 0011 0011 )は 1100 1100となります。
これを表すには 0011 0011 XOR 1111 1111とすることで
0011 0011 1111 1111 --------- 1100 1100
となり反転できます。
たとえば、2進数の1ビット目が0ならば偶数で、1ならば奇数という有名な話があります。
これを判断するのに判断したい数字 AND 1 を使います。なぜ1とANDするのかというのは考えてみてください。
ここでは12(偶数)を判定してみます。
12 ) 0000 1100 1 ) 0000 0001 -------------- 0 ) 0000 0000
結果が 0 となり偶数だとわかりました。では13(奇数)だと、
13 ) 0000 1101 1 ) 0000 0001 -------------- 1 ) 0000 0001
結果が 1 となり奇数だとわかりました。
このように、使える場面はたくさんあります。
シフト演算子はビットをずらす演算子です。
たとえば、1( 0000 0001 ) << 1 では1ビットずらして 2( 0000 0010 )となり
2( 0000 0010 ) << 1では1ビットずらして 4( 0000 0100 )となります。
このように1ビット左にずらすごとに2倍され、逆に右にずらすと 1/2倍されます。
では3倍するときは?となると思います。これは2倍と1倍を足せばいいんです。簡単です。2の3倍は・・
(2 << 1 ) + 2
4 ) 0000 0100 2 ) 0000 0010 + )---------- 6 ) 0000 0110
これで2*3 = 6が表現できました。
HSPのシフト演算は論理シフトなので、溢れた場所は0で埋められます。
ここで紹介したビット演算を使えば、ビット演算のみで四則演算が表現できるので、研究してみましょう!