2018-01-31
なでしこ3のANDやORがおかしい気がする件
なでしこ3 |
~~~~~~~~~~~~~~~~~~~~~~~~~~
※ v3.0.21にて修正されました!(2/5追記)
素早い対応に感謝ですね(≧▽≦)
~~~~~~~~~~~~~~~~~~~~~~~~~~
マイナビ連載20回目は、16進数とか2進数とかのことでした。
この記事を、もっともっとムカシに読みたかったね。
いや・・・タブン、それっぽいコトは見聞きしたハズなんだけどねえ・・・
まったく理解しなかったとゆうか、なんとゆうか?(バカ;)
10進法の暮らしに馴染んでいると、1000より1024のがキリがいいとか、ゆってる意味が分かりませんよね?!?!
ちなみに、2進法を使えば、両手の指10本で1023まで数えることが可能なんですが・・・確実に指をつります(´д`;
だけど、あいにく(?)わりと最近(!)ひらめいたんだよねぇ~w
そして、2進数にしてうーむと眺めれば、前々回の数当てカードの手品
(https://nadesiko.g.hatena.ne.jp/snowdrops89/20180102/1514902515)
が、一体どうゆう理屈で出来るのかも、ちょっと前に学んだ論理和
(https://nadesiko.g.hatena.ne.jp/snowdrops89/20170331/1490975484)
で、APIのパラメーターを複数設定することの意味とかも、なんとなく見えてくる。
こっ、コレが、こんぴゅうたぁのキモチが分かってくるってコトなんですかね(*^-^*)ポ
・・・それでねえ、ちょこっと数当てカードをなでしこ3で作ってみようと思ったら・・・できなかったんですぅ~。
数当て表を作る部分だけなので、配列の書き方のルールなんかが色々変わってるからアレですけど、すぐ出来る予定だったんですけどね。
まえに論理和を学んだ時にはクラクラとめまいがしてたもんだけど、もう大丈夫(たっ、タブン…;)
これはもう、ようするに、
全部1だった時だけ、1。
それ以外はみんな、0。
・・・てだけのコトです。
この計算は、もちろん二進数でとりおこなわれます。コンピューターなんで!
とゆうわけで、このルールに則って「1AND2」を縦計すると、こうゆうことになります。
0000 0001 AND 0000 0010 -------------- 0000 0000
両方1の部分がないから、0になります。
「4AND5」だったら・・・
0000 0100 AND 0000 0101 -------------- 0000 0100
答えは4になりますぅ~。
コレで、考え方はあってると思うんだけど・・・
さて、これをなでしこで計算します。
AND(1,2)を表示。 AND(4,5)を表示。
あんまり、なでしこのプログラムっぽくない!w
それはさておき、これをなでしこ1で実行すると、ちゃんと0と4が母艦に表示されるんですが・・・
なでしこ3の簡易エディタでは・・・なななんと、2と5になってしまうのですよーっ。
なんでだ・・・(?_?;
よくわかんないけど、v1非互換ともなっていないのに、なでしこ1となでしこ3とで答えが違ってしまうってゆうのは・・・
OR(1,4)を表示
が、1になってしまうんです。
XORについてはまだ学んでないので検証してませんが・・(しろよ;)
いつもいつもぼやいてばっかでスミマセン;
でも、とてもとても応援してます!(>_<)/
javascriptでは、
|と||や、&と&&のように使い分けられるのですが、なでしこは1のころからこの辺が混在したままで結局使うのが難しい機能になっています。
(どちらかのみでは、意図しないことになります)
ビット演算子としては、書かれている通りです。
14&7は、6になります。
14|7は、15です。
もう一方、BOOL(ビット単位ではなく、値そのものがtrueとfalseのあれ)真と偽としては、以下のようになります。
or演算子
左辺を評価し真(非0)ならその値を返す。左辺が偽(0)ならば右辺も評価しその値を返す。左辺が真の阿合は右辺は評価されません。
0||2||3は、2なります(3は評価されません)
14||7は14です。
and演算子
左辺を評価し偽(0)ならあその値を返す。左辺が真(非0)ならば右辺も評価しその値を返す。左辺が偽の場合は右辺は評価されません。
0&&2&&3は、0です(2,3は評価されません)
1&&2&&3&&4が、4です(1,2,3,4のすべてが評価されます)
14&&7は7です。
という感じと記憶してますがいかがでしょうか。
またまたなんだかよくワカンナイかんじに~(@_@)
これはもう・・・脳がフリーズしちゃうヤツだ><
しかし・・・つまり、ANDとORには実は2種類あって、おかしくはなってないんだけど、なでしこ1となでしこ3とでは、さりげなーく仕様が変わってしまった・・・というコトなのでしょうか。
あああ・・・そして、なるほど。
AND(1,2)とAND(2,1)の結果が、なでしこ3の場合違ってしまうのもナゾだと思っていましたが、こうゆうことだったのですね!
なんかもう本当に、いつもいつもありがとうございます!!!
ABCは14
DEFは7
「{ABC}|{DEF}」をJS実行を表示
「{ABC}&{DEF}」をJS実行を表示
「{ABC}^{DEF}」をJS実行を表示
BWORは『(function(){return function(){var i=1,r=arguments[0];while(i<arguments.length-1){r|=arguments[i++];}return r;}})()』をJS実行
BWANDは『(function(){return function(){var i=1,r=arguments[0];while(i<arguments.length-1){r&=arguments[i++];}return r;}})()』をJS実行
BWXORは『(function(){return function(){var i=1,r=arguments[0];while(i<arguments.length-1){r^=arguments[i++];}return r;}})()』をJS実行
BWOR(ABC,DEF)を表示
BWAND(ABC,DEF)を表示
BWXOR(ABC,DEF)を表示
なでしこ1で似たことをするとしたら、Luaの利用でしょうか。
なんと、これを使えば、Javascriptで出来ることはだいたい、なでしこで出来ちゃうということなんですね!
といっても、Javascript部分はマッタク分かりませんが;
でも、これをこのまま使わせてもらって、上手いことできそう。
対応して頂けそうな感じにもなってますが、
https://github.com/kujirahand/nadesiko3/issues/260
バージョンアップまではコレですね。
ありがとうございます☆