Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2018/01/31 (水)

なでしこ3のANDやORがおかしい気がする件

| 16:26 | なでしこ3のANDやORがおかしい気がする件 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - なでしこ3のANDやORがおかしい気がする件 - 雪乃☆雫のなでしこ日和 なでしこ3のANDやORがおかしい気がする件 - 雪乃☆雫のなでしこ日和 のブックマークコメント

~~~~~~~~~~~~~~~~~~~~~~~~~~

※ 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で作ってみようと思ったら・・・できなかったんですぅ~。

 数当て表を作る部分だけなので、配列の書き方のルールなんかが色々変わってるからアレですけど、すぐ出来る予定だったんですけどね。

 なんか・・・なでしこ3のANDが、おかしくないですか???

 AND論理です。

 まえに論理和を学んだ時にはクラクラとめまいがしてたもんだけど、もう大丈夫(たっ、タブン…;)

 これはもう、ようするに、

全部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もおかしくないかな。

OR(1,4)を表示

 が、1になってしまうんです。

 XORについてはまだ学んでないので検証してませんが・・(しろよ;)


 いつもいつもぼやいてばっかでスミマセン;

 でも、とてもとても応援してます!(>_<)/

通りすがり通りすがり 2018/01/31 22:33 ANDやORはビット演算子としての側面と、BOOL代数(真理値)としての側面があるため、ややこしい感じに。

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です。

という感じと記憶してますがいかがでしょうか。

雪乃☆雫雪乃☆雫 2018/02/01 06:46 ・・・ナナナなんて?(*_*;
またまたなんだかよくワカンナイかんじに~(@_@)
これはもう・・・脳がフリーズしちゃうヤツだ><

しかし・・・つまり、ANDとORには実は2種類あって、おかしくはなってないんだけど、なでしこ1となでしこ3とでは、さりげなーく仕様が変わってしまった・・・というコトなのでしょうか。

あああ・・・そして、なるほど。
AND(1,2)とAND(2,1)の結果が、なでしこ3の場合違ってしまうのもナゾだと思っていましたが、こうゆうことだったのですね!

なんかもう本当に、いつもいつもありがとうございます!!!

通りすがり通りすがり 2018/02/02 20:30 なでしこ3ならばjavascriptベースで、javascriptには個別の演算子があるのになぁ ということで、少しひらめきました。

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の利用でしょうか。

雪乃☆雫雪乃☆雫 2018/02/04 19:58 JS実行!
なんと、これを使えば、Javascriptで出来ることはだいたい、なでしこで出来ちゃうということなんですね!
といっても、Javascript部分はマッタク分かりませんが;
でも、これをこのまま使わせてもらって、上手いことできそう。
対応して頂けそうな感じにもなってますが、
https://github.com/kujirahand/nadesiko3/issues/260
バージョンアップまではコレですね。
ありがとうございます☆

ゲスト



トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180131