hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
HSP講座/ビット演算 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

ビット演算

AND ( & )演算子

AND演算子は条件が全て「真」となるときに「真」となる演算です。 日本語では「かつ」に相当します。
例えば
○が「真」で□が「真」のとき
 ○ AND □ は「真」となり

○が「真」で□が「偽」のとき
 ○ AND □ は「偽」となります。

表にして見てみると...

○ & □

となり、共に「真」の場合だけが「真」となるのがわかると思います。

学校の数学で集合を勉強されている方は、 積集合をイメージするとわかりやすいでしょう。

言葉の解説

「真」・「偽」
正しいことを、そうでないことをと言います。
たとえば…

1 < 2

↑これは式が成り立っていて正しいのでです。
じゃあ、↓これはどうでしょうか?

1 = 2

式が成り立っていませんね。正しくないのでになります。

この真偽という考え方は、後ほど条件分岐(if命令など)で必要となってきます。

OR ( | )演算子

OR演算子は条件が一つでも「真」となるときに「真」となる演算です。 日本語では「または」に相当します。
例えば
○が「真」で□が「真」のとき
 ○ OR □ は「真」となり

○が「真」で□が「偽」のとき
 ○ OR □ は「真」となります。

表にして見てみると...

○ | □

となり、一つでも「真」の場合「真」となるのがわかります。

学校の数学で集合を勉強されている方は、 和集合をイメージするとわかりやすいでしょう。

XOR ( ^ )演算子

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で埋められます。

さいごに

ここで紹介したビット演算を使えば、ビット演算のみで四則演算が表現できるので、研究してみましょう!


トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-08-01 (日) 18:06:02 (1224d)