書いているうちになんか解決しそうな勢い...?。
まあ、せっかくなので私も書き込ませていただきます。
if key&16 : ホニャララ〜
と書くと、
「key」が持つ数字の中で「16 (2進法では「10000」)」を表すビットが立っている
という条件がクリアされた時に ホニャララ〜 が実行されます。
if key = 16 : ホニャララ〜
と書くと、
「key」が持つ数がぴったり16
という条件がクリアされた時に ホニャララ〜 が実行されます。
「だからどうした?」と思うかもしれません。
「&」(=「AND」)が役に立つのは次のような場合です。
key = 16 + 8
このとき「k」は「24」を持ちますから、
if key = 16
は条件クリアになりません。
しかし、
if (key&16) = 16 ※←省略すると「if key&16」と書けるらしい。
さらに、
if (key&8) = 8
も条件クリアになります。
「ビット演算」で調べればわかる話ですが、ほんのりと説明します。
「key」が持つ数は10進法では「24」と表されますが、2進法では「11000」と表されます。
2の4,3乗の位が1で、あとはすべて0です。(※知っていると思いますが、0でない実数の0乗は1です
から、2の0乗1です。)
この状況を「5番目のビットが立っている」「4番目のビットが立っている」と言いましょう。
こうすれば乱暴かもしれませんが、「位の数を使って状況を記述する」ことができます。
例えばキーボードを監視するプログラムを考えます。
Aキーが押されていれば「key」の5番目のビットを立てる。
Bキーが押されていれば「key」の4番目のビットを立てる。
この2つのアクションががともに起こった場合、
「key」は「24」すなわち、「11000」となります。
「8」でも「16」でもありませんが、「8の位」「16の位」はともに1です。
つまり、A,Bのキーがともに押されていることがわかります。
if key = 16
等では検出できないような状況を、
if (key&16) = 16
とすることで「他のキーはさておき、とりあえずAは押されている」ということを検知できます。
Bキーについても同様です。
↓はおまけです。
key = 16 + 8
if key = 16 {
mes "kは16" //実際にはk≠16だからこれは実行されない。
}
if (key&16) = 16 {
mes "kで「16」を表せるビットが立っている。"
}
if (key&8) = 8 {
mes "kで「8」を表せるビットが立っている。"
}
もういっちょおまけ。
(調べればすぐ分かっちゃうんですが(^_^))
;知ってると思うけど、「0でない実数の0乗」は「1」と定義されている。
;だから例えば、「2の0乗」は1。
;ちなみに、「0の0乗」は一般には定義されていないが、HSPでは「1」らしい。
//////////// お膳立て ////////////
a = 8 + 4 + 2 + 1 ;2の1,2,3乗の位がすべて1
;2進法表記↓
;{a} : 1111
b = 8 + 4 + 0 + 1 ;2の1乗の位が0
;{b} : 1101
c = 8 + 0 + 0 + 1 ;2の1,2乗の位が0
;{c} : 1001
///////////////////////////////////
k = a&b ;kは「13」となる
mes k
; {a} : 1111
;(AND) {b} : 1101 ;「AND」というのは"上下ともに1同士"であるの位のみを1として出力する「操作」
;
;= {k} : 1101
; 「1101」は 2^3 + 2^2 + 0 + 2^0 = 8+4+0+1 = 13
; つまりkは10進法で「13」と表される数のこと。
l = b&c ;lは「9」となる
mes l
; {b} : 1101
;(AND) {c} : 1001
;
;= {l} : 1001
; 「1001」は 2^3 + 0 + 0 + 2^0 = 8+0+0+1 = 9