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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0218
春蜜柑if文の比較演算子の意味がわかりません11解決


春蜜柑

リンク

2013/2/18(Mon) 00:05:36|NO.52457

と言っても+-><=などといった基本的なものではなく、
サンプルスクリプトなどでちょくちょく見かける

if X&32 : mes "Hello!"

というようなものです
ifの説明では触れられていないのでどのように使うのかがよくわかりません。
検索した結果

a = 16 : b = 1 if a&16 : mes "a&16" if (a&16) & (b=1) : mes "(a&16) & (b=1)" ;ここは表示されない! if ((a&16)!0) & (b=1) : mes "((a&16)!0) & (b=1)" mes "-----<条件式の結果>-----" mes "a&16 → " + (a&16) mes "(a&16) & (b=1) → " + ((a&16) & (b=1)) mes "((a&16)!0) & (b=1) → " + (((a&16)!0) & (b=1))
というものを見つけたのですが、
これをみる限りでは「aと言う変数に16が含まれている場合」だとおもうのですが、
そうするとなぜ2行目がNGで3行目がOKとなるのかがよくわかりません

またa=2として、

if a&1 : mes "a&1" if a&2 : mes "a&2"
とすると1行目も1が含まれているのに表示されません
この「&」は使い方はどうなっているのでしょうか?



この記事に返信する


ZAP

リンク

2013/2/18(Mon) 00:33:07|NO.52459

&には
・条件式としての&
・2進数のビット演算子
の意味があります。

a&1、a&2、a&16はいずれもビット演算です。
2進数にして考えると答えは分かると思います。

(a&16) & (b=1) は
a&16というビット演算の答えと、(b=1)と言う条件式の答えを
さらに&でビット演算しています。

つまり、a = 16 : b = 1 のとき、
(a&16) & (b=1) は、
 16  &  1 となり、
その答えは、0 です。
ゆえに、if条件は成立せず、mesは実行されません。



@key

リンク

2013/2/18(Mon) 00:33:44|NO.52461

"&"、というのは論理演算子で論理積(AND)を示します
今じゃそんなに有名じゃありませんが機械語やその一歩進化したくらいの言語では基礎の基礎です

論理積の詳しくはwikipediaを見て欲しいんですが、
簡単に言うと(A&B)の形で、Aを2進数にした時のビットにBのビットの1の所が重なってる値を返す命令です
例) 10進数→2進数の形
14→1110
13→1101
答え→1100


ちなみにHSPで"and"命令のヘルプを見るとわかるように&は比較演算子ではありません

mes (1023&13)
mes (1024&13)
などとするとよくわかると思います



晩御飯

リンク

2013/2/18(Mon) 00:55:09|NO.52464

論理積とかどんな高級言語でも使うんですけどそれは大丈夫なんですかね
そもそもHSPの&は全てビット演算子で論理演算は関係ないです



ツノン

リンク

2013/2/18(Mon) 05:15:24|NO.52474

ちなみに 先頭に 0b または % を 付加する事で 二進数で数値を記述する事が出来ます。
下は方向キーで 丸を移動させるサンプル

#const r 5 title "方向キーを入力してください" x=200 y=200 *@ stick key,0b1111 // 1〜8 を非トリガー指定 redraw 0 color 255,255,255:boxf if( key & 0b0001 ):x-- // key&1 と同じ 1 番目のビットが 立っているか if( key & 0b0010 ):y-- // key&2 と同じ 2 番目のビットが 立っているか if( key & 0b0100 ):x++ // key&4 と同じ 3 番目のビットが 立っているか if( key & 0b1000 ):y++ // key&8 と同じ 4 番目のビットが 立っているか color 255:circle x-r,y-r,x+r,y+r,1 redraw await 30 goto*@b



ツノン

リンク

2013/2/18(Mon) 07:03:28|NO.52475

ヘルプ内からも参照できる
「HSP3 プログラミング・マニュアル」
を一度熟読してみることをお勧めします。

hsp で使用できる全ての演算子の一覧等、hspプログラミングを行う上で為になる情報も多いですよ。



HT.

リンク

2013/2/18(Mon) 18:03:06|NO.52484

まずは2進数について調べて理解してください。
1 … 00000001
2 … 00000010
4 … 00000100
8 … 00001000
と分かるように桁が増えるごとに2の累乗になります。2進数なので当たり前ですね。
要は比較対象を2進数にしたとき、1となっている桁が一致しているかどうかを調べるのが&演算子です。
例えば47は2進数で表記すると00101111となるので、1, 2, 4, 8の全てと他に32を含みます。合計すると47ですね。



GENKI

リンク

2013/2/18(Mon) 23:30:29|NO.52495

HSP開発wikiに資料これ関連の資料がたくさんあります。
まずはご一読下さい。

if 命令
http://hspdev-wiki.net/?HspCmd%2Fif

ビット操作
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D3%A5%C3%A5%C8%C1%E0%BA%EE

ビット演算
http://hspdev-wiki.net/?HSP%B9%D6%BA%C2%2F%A5%D3%A5%C3%A5%C8%B1%E9%BB%BB

ビット操作に入る前に「2進数」について調べておくといいと思います。


HSP開発wikiだとこれぐらいしか関連記事ないな…。解説ですらないし。(´・ω・`)
○進数の相互変換
http://hspdev-wiki.net/?%BF%F4%C3%CD%BD%F1%BC%B0%CA%D1%B4%B9



春蜜柑

リンク

2013/2/19(Tue) 00:26:30|NO.52497

いろいろレスありがとうございます
2進数から一致部分を取り出す、というのは
a=33
if a&1 : mes "1"

このような場合その合計された数字の中に対象の2の塁上の数字が、分解した時に重複しないで一つだけ含まれている場合に
反応する、ということでいいでしょうか?



ANTARES

リンク

2013/2/19(Tue) 00:51:40|NO.52498

 まず、ifの条件式は演算結果が0でないとき真と判定されます。
だから、「if a&1: ……」は
「if (a&1)!=0: ……」と解釈するとわかりやすくなります。

 次に&ですが、これは複数の条件を両方満たしていることを指定するのが、
一般的です。
例えば、「if a>0 & b>0: ……」はaもbも正の場合のみ真と判定されます。

ただし、&演算子は実際にはビットごとの論理積をとります。
各ビットごとに二つの数を比較して両方1の場合のみ対応するビットが1になり、
他の場合は0になります。ですから、aが33の場合「a&1」は

33=%100001

%100001 &) %000001 ────── %000001
つまり、a&1=1です。
そして、これは0ではありませんから「if a&1」は真と判定されます。

結局、「if a&1: ……」は、aの最下位ビットが1の場合(言い換えれば奇数の
場合)のみ、「……」を実行することになります。



GENKI

リンク

2013/2/19(Tue) 01:28:41|NO.52499

IF文についてちゃんとした説明が出てきたのでサンプル書いてみる。

> まず、ifの条件式は演算結果が0でないとき真と判定されます。

と、既に説明されている通りなんですが実際に書いてみるとこうなります。

if -1 : mes "-1" : else : mes "X" if 0 : mes "0" : else : mes "X" if 1 : mes "1" : else : mes "X" if 2 : mes "2" : else : mes "X"
初めて見ると条件でもなんでもない事にびっくりなんですがこの事実の実感は重要です。
また条件式も書きだしてみるのも大切です。

mes "5=5 : " + (5=5) mes "6&4 : " + (6&4) mes "(6&4)!0 : " + ((6&4)!0)
条件式の計算結果が数値に鳴っているのがわかると思います。


> このような場合その合計された数字の中に対象の2の塁上の数字が、分解した時に重複しないで一つだけ含

難しく考えすぎです。(´・ω・`)
2進数で書きだしてみてから考えてみて下さい。パソコンは2進数で考えています。
なれないうちは紙に書きだしたりするのもいいです。

ちなみに2進数への換算はWindows標準の電卓が便利です。
関数電卓やプログラマのモードに切り替えて使って下さい。



春蜜柑

リンク

2013/2/19(Tue) 01:39:06|NO.52500

ANTARESさん、GENKIさん、さらなる説明ありがとうございます

%100001 &) %000001 ────── %000001
なるほど
2進数化して上下にならべて1箇所でも共通項があれば成立するという考え方なんですね

そして改めて検索したり参照URLでいろいろ解説が出てきますね…
そもそもビット演算・論理積という言葉を全く知らなかったので検索しきれなかったようです
「if &」で検索しても普通の使い方しかヒットしなかったので…orz



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