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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0816
曲者if ( int(実数) & 4 ) 条件式が満たされないのは何故?2解決


曲者

リンク

2019/8/16(Fri) 05:44:25|NO.88064

stick命令のドキュメントライブラリである一つの使い方が出ている&演算子。
変数に1,2,4,8,16...というような数が和となって入っている時、
その和の元となる数に条件の数が含まれているかを判別できる、
と私は解釈していて、stick命令での変数に限らず使えたはずですが、

dimtype a , vartype("double") , 1 , 3//予定の配列要素数は一次512,二次7
acnt = 0 f a , 15.0 , 5.0//定義命令 repeat length(a) , 0 if (a.cnt.0 == 1.0) { if (int(a.cnt.1) & 1) && (a.cnt.2 > 0.0) {//これを条件式Aとします mes "A動作" a.cnt.2 -- } if (int(a.cnt.1) & 4) && (a.cnt.2 > 0.0) {//これを条件式Bとします mes "B動作" a.cnt.2 -- } } loop #deffunc f array list , double side , double times if (length(list) != acnt) { repeat length(list) , 0 if (a.cnt.0 == 0.0) { a.cnt.0 = 1.0 a.cnt.1 = side a.cnt.2 = times acnt ++ } loop } return

このようなプログラムではBは動作しなかったのです。
記述エラーはでないので論理エラーのようですが…。
本当はB以外にも(int(a.cnt.1) & 4)の部分の4が2と8の式も
ありますが、その二つも同様に動きません。
AもBもここでは省略した式がありますが、それらは
それらだけでならくぐれているので余り関係がないかと。

なぜ&1以外はダメなのでしょうか?



この記事に返信する


沢渡

リンク

2019/8/16(Fri) 11:27:04|NO.88075

条件式B : (int(a.cnt.1) & 4) && (a.cnt.2 > 0.0)
を計算した場合、この時点でint(a.cnt.1)は15、a.cnt.2は4.0なので、
計算結果は以下のようになります。

15 & 4 =4 4.0>0.0=1 4 && 1=0
そして、「if ○○ : ××」という命令の内容は、
正確に言うと「○○が0以外なら××を実行する」というものですから、
ここでは計算結果が0なので、条件式B以下は実行されないことになります。
条件式Bを以下のように変更してやれば上手くいくと思います。

((int(a.cnt.1) & 4)!=0) && (a.cnt.2 > 0.0)


------------------------------------------------


以下、解説になりますが、&(&&も同内容)は論理演算子というもので、
たとえば、15という数値と4という数値を&(AND)する場合、
まずそれぞれをビットで表します。

15 → 1111 4 → 0100
そして、AND演算では各ビットの桁同士を比べ、両方が1である桁のみを1にし、
ほかは全て0にします。

15&4 → 0100
これがAND演算の計算結果です。
同様に、4&1はどうなるのかというと、

4 → 0100 1 → 0001 4&1 → 0000
ここではAND(&)について説明しましたが、
OR(|)では「どちらか片方でも1なら結果は1」で、
XOR(^)では「どちらか片方"だけが"1なら結果は1」となります。

それから、「>」や「!=」ですが、これは比較演算子といって、
「条件を満たしているなら計算結果は1に、満たしていないなら0になる」
というものです。
たとえば「4>1」の計算結果は1になり、「4<1」の計算結果は0になります。
こうして比較演算と論理演算を組み合わせることで、if文の条件式は成り立っているのです。



曲者

リンク

2019/8/17(Sat) 15:13:50|NO.88095

なるほど、&にHSP特有の演算があるのかと思っていましたが、
やはり論理演算でビットを見ていたたわけですか…
それでANDを潜り抜けた数値が返される。
だからそれで出てきた4と1がANDされた時に、
共通ビットがないから0になってしまう、と。
論理積って言葉の由来もこういうことなのか…?
兎に角理解できました!と思います!

式も書き換えてみたら、確かに無事望んでいた動作になりました!
これで作業を次に進めることができます!

本当にありがとうございました!
という言葉では感謝しきれません!



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