HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0211
デモニカ「=」と「&」の違い。4解決


デモニカ

リンク

2014/2/11(Tue) 12:50:43|NO.59878

if key&16

if key=16

の違いが明確に理解できません。
一体何が違っていて、どのような状況で使い分けるんでしょうか?



この記事に返信する


kanahiron

リンク

2014/2/11(Tue) 13:43:32|NO.59883

&は論理演算の1種です
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/logicope.html

例えば、
a = 17 は
a = 0b10001です
なので、
a & 0b10000と
a & 0b00001 には真を返します(つまり、ifでは実行される)
ですが
a == 16
a == 1
は17じゃないですよね

うーん 説明が下手で申し訳ないです
2進数、16進数、論理演算について勉強すればわかると思います



Tetr@pod

リンク

2014/2/11(Tue) 14:01:34|NO.59884

こちらの&版と

x = 320 y = 240 *main stick key, 15 if key & 1 : x -= 3 if key & 2 : y -= 3 if key & 4 : x += 3 if key & 8 : y += 3 boxf x - 5, y - 5, x + 5, y + 5 await 12 goto *main
とこちらの=版

x = 320 y = 240 *main stick key, 15 if key = 1 : x -= 3 if key = 2 : y -= 3 if key = 4 : x += 3 if key = 8 : y += 3 boxf x - 5, y - 5, x + 5, y + 5 await 12 goto *main
を実行し、十字キーを色々押して(同時押しもやって!)みてください。
&の方では斜めに移動できるのに対し、
=の方では縦と横にしか移動できないのがわかると思います。
さらに、=の方ではキーを同時に押した時に全く動かなかったと思います。

このように、&は同時押しに対応でき、=は同時押しに対応できないという違いがあります。
(ただし、stick命令に限った話です。実態はkanahironさんが答えていますので、ここでは割愛します。)



FunnyMaker

リンク

2014/2/11(Tue) 14:10:34|NO.59885

書いているうちになんか解決しそうな勢い...?。
まあ、せっかくなので私も書き込ませていただきます。


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



デモニカ

リンク

2014/2/11(Tue) 16:40:46|NO.59893

なるほど〜。
そういう仕組みでしたか・・・
わかりやすかったです。
皆さんありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.