ユーザ用ツール


guide17

17:0と1だけの世界

それで、ロンリーエンジンってなんだよ?ちょっとかっこいい言葉ことばだが、おまえもジジイも顔かおが引ひきつってたし、どうも気きになるぜ。
論理ろんり演算えんざんだよ。そうだね・・・いよいよ試練しれんに立たち向むかう時ときが来きたかもしれないね。
よせよおどかしやがって、失敗しっぱいしたら死しぬようなシレンじゃねえだろうな。
ハハハ、死しぬ事ことはないよ。論理ろんり演算えんざんってのは、プログラミングで避さけて通とおれない考かんがえ方かたなんだけど、結構けっこう難むずかしいんだよ。それでここまでは論理ろんり演算えんざんをわざと避さけてきたんだけど、先さきに進すすむにはそろそろ基本きほんを理解りかいしてもらわないとダメかもね。
おいおい、見みた事こともないややこしい数式すうしきとか出でてくるんじゃねえだろうなあ・・・
いや、数学すうがくは数学すうがくでも、数式すうしきはほとんどいらないんだ。数字すうじも0と1だけしか使つかわないよ。
なんだよ、0と1しか使つかわないならもうオレサマの勝利しょうりは決きまったも同然どうぜんじゃないか!
本当ほんとうに大丈夫だいじょうぶかなあ。
0と1だけなんだけど・・・いや、グズグズ言いってても仕方しかたがない。じゃあいくよ!



ねえ、コンピューターってものすごい速はやさでものすごい計算けいさんをいっぱいしてくれるけど、数かずは0からいくつまで知しっていると思おもう?
そりゃあ、すげえいっぱいまで知しってるんじゃねえのか?100億おくとか1000兆ちょうとかよ。
実じつはコンピューターは0と1しか知しらないんだ。
な、なにぃ・・・やいインテリ、いいかげんなこと言いってんじゃねえぞ。0と1だけじゃ電卓でんたくにもならねえぞ。けどちゃんと電卓でんたくになったじゃねえか!
1個この0と1だけじゃあ何なんにもできないね。コンピューターはね、0と1をたくさんたばねて計算けいさんする事ことができるのさ。
例たとえばSwitchスイッチは0か1を32個ことか64個こたばねたものを数かずとして使つかうんだ。そうだねえ、0か1って言いってるけど、1個このライトだと思おもってよ。光ひかってたら1、消きえてたら0。そのライトが32個こか64個こずらっと並ならんでる。想像そうぞうできるかな?
それくらいなら想像そうぞうつくぜ。
じゃあ32個このランプがそれぞれついたり消きえたりするとして、その光ひかり方かたのパターンて何個なんこあるかわかるかい?
それぞれがついたり消きえたりするんだな。一番いちばん右みぎがついて、消きえて、その隣となりがついてる時ときに一番いちばん右みぎがついて、消きえて、もうひとつ隣となりがついてる時ときに・・・うおお!数かぞえられねえ!
ランプ1個こだと2通とおりだよね。ついてるのと消きえてるの。2個こだと4通とおりになるのはわかるかな?、じつは3個こだと8通とおり、4個こだと16通とおり・・・と、倍々ばいばいに増ふえていくんだ。
そして32個こあると、なんと42億通おくとおりの光ひかり方かたがあるのさ。正確せいかくには42億おく9496万まん7296通とおりだけどね。
そりゃあ数かぞえられないわけだぜ。
そこで、この光ひかり方かた1個こ1個こに普通ふつうの数かずを振ふっていくと、0から42億おくまでの数かずを32個このランプの光ひかり方かたで表あらわす事ことができるのさ、どう?ここまでは大丈夫だいじょうぶ?
ものすげえ数かずだが、ようは光ひかり方かたごとに番号ばんごうを振ふるんだな?
そう!それで、このランプの事ことをビットって言いうよ。32個このランプは32ビットさ。そしてコンピューターはこのビットってやつを使つかってなんでもかんでも計算けいさんするんだ。
ランプのオンオフ、つまり0と1の2種類しゅるいの数かずだけ使つかうから、2進数しんすうっていう言いい方かたをするんだ。言いい換かえるとコンピューターは2進数しんすうで計算けいさんをしているって事ことだね。
さて、2進数しんすうの話はなしもすごく大事だいじだけど、今回こんかいはここまでにして、ここからはランプ1個こだけの計算けいさんを考かんがえよう。そこで出でてくるのが論理ろんり演算えんざんなんだよ。
ランプ1個こってことは光ひかってるか光ひかってないだけじゃねえか。計算けいさんもへったくれもあるのかよ。
それがあるのさ!



計算けいさんだから、ランプ1個こと、もう1個このランプを考かんがえよう、そして計算けいさん結果けっかのランプもあるよ。
普通ふつうの計算けいさんは、足たし算ざん、引ひき算ざん、かけ算ざん、割わり算ざんの4つの計算けいさんがあるよね?論理ろんり演算えんざん、つまりランプとランプの計算方法けいさんほうほうもそれと似にているよ。最初さいしょはへんてこりんに見みえるけど慣なれればなんてことはない。
まずANDアンド。ランプが両方りょうほうついている時ときだけ、計算けいさん結果けっかのランプもつくんだ。どっちか一方いっぽうが消きえてたり、両方りょうほう消きえてたら、計算けいさん結果けっかランプも消きえるよ。
えーと、数字すうじに置おき換かえると、1 ANDアンド 1は1で0 ANDアンド 1は0ってことかな?
そう!いいね!








次つぎにORオア。これはランプがどちらか一方いっぽうでもついていたら、計算けいさん結果けっかランプもつくんだ。結果けっかランプが消きえるのは両方消りょうほうきえてる時ときだけだよ。
うう、つ、つまり、1 ORオア 0は1、0 ORオア 1も1で、0 ORオア 0は0、か?
そうそう!君きみたちはやっぱりプログラミングのセンスがあるよ!








次つぎはNOTノット。これはランプ1個こだけ。光ひかり方かたをひっくり返かえす計算けいさんだよ。NOTノット 0が1に、NOTノット 1が0になるんだ。








ちなみに日本語にほんごではANDアンドは論理ろんり積せき、ORオアは論理ろんり和わ、NOTノットは論理ろんり否定ひていと言いうよ。名前なまえの通とおりANDアンドはかけ算さん、ORオアは足たし算さんに似にてるんだ。
まとめると、ANDアンドはビットのかけ算さん、ORオアはビットの足たし算さん、NOTノットはなんだかマイナスつけるっぽい感かんじ?
そうだね。この3つの計算方法けいさんほうほうを組合くみあわせるだけで、いろいろな計算けいさんができるんだ。
ランプ1個この計算けいさんができることはわかったぜ。0と1だけだからカンタンだしな。でも0と1だけ計算けいさんできてもなんの役やくにも立たたねえんじゃねえのか?
ここからが本番ほんばんさ。



話はなしは飛とぶけど、IFイフ文ぶんってあるよね?
ハナシをごまかすんじゃねえ、IFイフ文ぶんとランプってなんの関係かんけいもねえだろう。
ワンパク君くん、IFイフ文ぶんって何なにをするんだったっけ?
ナニー!てめえ人ひとの話聞はなしきいてねえのかよ!IFイフ文ぶんなんて、正解せいかいならTHENゼンから先さきを実行じっこうする、間違まちがってたら実行じっこうしない、ランプと全然関係ぜんぜんかんけいねームキー!
それで、さっきボクが言いったこと覚おぼえてるかな?コンピューターは全部ぜんぶの計算けいさんを0か1、つまりビットでやるんだよね?てことはIFイフ文ぶんもビットでやってるんだけど、どうやると思おもう?
へ・・・?
あ・・・
ちょっと待まてよ・・・条件じょうけんが正解せいかいなら実行じっこうする、間違まちがってたら実行じっこうしない・・・ビットっつうかランプ・・・ついてたら実行じっこうする、消きえてたら実行じっこうしない・・・!
フフ、もう少すこしかな?
正解せいかいだとランプがつく、間違まちがってるとランプが消きえるとすれば、正解せいかいだとランプがついて実行じっこうする、間違まちがってたらランプがつかないから実行じっこうしない・・・
つまり、条件じょうけんが正解せいかいかどうかでランプがついたり消きえたりして、IFイフ文ぶんはそのランプを見みてTHENゼンを実行じっこうしたりしなかったりする!
正解せいかい!
ビットで言いい換かえると、IFイフ文ぶんは条件じょうけんの結果けっかを、正解せいかいなら1、間違まちがってたら0っていうふうに解釈かいしゃくするんだ。そして、条件じょうけんの結果けっかが1だったら正解せいかいだと思おもってTHENゼンを実行じっこうするんだよ。
IFイフ文ぶんの条件じょうけんのところで==とか<とか書かくだろう?あれは実じつは値あたいが同おなじなら1、違ちがったら0だったり右みぎの値あたいの方ほうが大おおきかったら1、そうじゃなかったら0っていう意味いみなんだよ。そしてその結果けっかでTHENゼンを実行じっこうしたりしなかったりする。これがIFイフ文ぶんの中なかでコンピューターが行おこなっている事ことなんだよ。
IFイフ文ぶんも0と1だけで動うごいてるのはわかったぜ。でもANDアンドやORオアはどこ行いったんだ?
じゃあ、また話はなしは飛とぶけど、15章しょうの弾たまを撃うつ時ときのIFイフ文覚ぶんおぼえてるかな?
うおーまた飛とびやがって!覚おぼえてるぜ!マリョリョ・・・
IFイフ文ぶんの中なかにIFイフ文ぶんを書かいてたやつだよね?

  'まずたまがないことをチェック
  IF TAMA==0 THEN
   'つぎにボタンをチェック
   IF BUTTON(1,#B_RRIGHT)==1 THEN
    'たまはっしゃ!
   ENDIF
  ENDIF

これこれ。
これ、実じつはIFイフ文ぶん1個こで書かけるんだ。
リョリョ・・・へ?
日本語にほんごでこのコードを説明せつめいすると弾たまがなくて、ボタンが押おされていたら、弾発射たまはっしゃだよね?
これをランプに置おき換かえてみよう。ボタンが押おされたらランプが付つく、弾たまがなかったらもう1個こランプが付つくって考かんがえたら、どうなる?
ランプが2個こついたら、弾たま発射はっしゃ、かな?あれ?なんか聞きいた事ことあるような・・・
ANDアンドじゃねえか!ランプが2個付こついたら、計算けいさん結果けっかのランプがつく!
そう!つまり弾たまがない ANDアンド ボタンが押おされているってこと!
これをBASICで書かくとこうなるんだ!

 IF TAMA==0 && BUTTON(1,#B_RRIGHT)==1 THEN
  'たまはっしゃ!
 ENDIF

IFイフ文ぶんの中なかのANDアンドは&&って書かくよ。&&両側りょうがわの結果けっかが1だったら、つまりどっちも正解せいかいなら、THENゼン実行じっこうっていう事ことになるよ!
な、なるほど、ANDアンドとIFイフがこうつながるわけか。
でもよう?IFイフ文ぶんふたつ組合くみあわせれば今いままでだって書かけたわけだよな?ANDアンドだのORオアだのわざわざややこしい説明せつめいをしたってことは、変数へんすうの時ときと同おなじなにかウラがあるんだろう。
フフ、まだORオアの出番でばんが来きてないしね!IFイフ文ぶんを入いれ子こにしただけじゃ絶対ぜったいに書かけない事ことをやってみよう。Aボタンだけじゃなく、Xボタンでも弾たまを発射はっしゃしたいと思おもったらどうする?「弾たまがない時ときに」はいったんはずして、ボタンだけで考かんがえてみて。
うう、全然ぜんぜんわからねえ・・・
まず日本語にほんごで書かいてみよう!Xボタンは#B_RUPだよ!
ええと、B_RRIGHTが押おされたか、B_RUPが押おされたかしたら、タマ発射はっしゃか。
IFイフ文ぶんだけで行いくぜ。ええと、ええと・・・ダメだ、書かけねえ・・・
このアレしたかソレしたかのどっちかっていうのに使つかうのがORオアなんだよ!
B_RRIGHTが押おされた ORオア B_RUPが押おされたってことか?
正解せいかい!じゃあそこに弾たまがないってのを付つけ足たしてみようか。
さっきのANDアンドをくっつけりゃいいんだろう?タマがない ANDアンド B_RRIGHTが押おされた ORオア B_RUPが押おされただな。
おしい!ORオア と ANDアンドが両方出りょうほうでてきた時ときは、ANDアンドが先さきに計算けいさんされるんだ。足たし算さんとかけ算さんが混まざっていたらかけ算さんを先さきにやるのと同おなじだね。そういうときに足たし算さんを先さきにやる方法ほうほうは算数さんすうでならったはず!
かっこか!タマがない ANDアンド (B_RRIGHTが押おされた ORオア B_RUPが押おされた)ってことだな!
正解せいかい!
プチコンを始はじめる前まえはかっこなんて使つかえなかったのにね。
神崎かんざき、そろそろオレのイエローカードが出でてくるぞ。
じゃあそのままプログラムにしてみてよ!IFイフ文ぶんの中なかではORオアは||って書かくよ!
よし・・・

 IF TAMA==0 && (BUTTON(1,#B_RRIGHT)==1 || BUTTON(1,#B_RUP)==1) THEN
  'たまはっしゃ!
 ENDIF

こうか!
正解せいかい!
まとめるよ。論理ろんり演算えんざんを使つかうと、IFイフ文ぶんの条件じょうけんをいくつも組合くみあわせて複雑ふくざつな条件じょうけんにできるんだ。ANDアンド、IFイフ文ぶんの中なかだと&&だね、これはふたつの条件じょうけんが両方正解りょうほうせいかいだったら、ORオアは||、これはふたつの条件じょうけんのどちらか、もしくは両方正解りょうほうせいかいだったら、NOTノットは今回出こんかいでてこなかったけどIFイフ文ぶんでは!と書かいて、使つかうと正解不正解せいかいふせいかいをひっくり返かえせるよ。
&&、||、!の読よみ方かたは人ひとによってまちまちだけど、ボクはそれぞれアンドアンド、オアオア、ノットって読よんでるね。!は正式せいしきにはエクスクラメーションマークって言いうんだけどプログラムの中なかでちゃんとそう読よむむ人ひとは少すくないんじゃないかな。あ、ハカセはビックリって読よんでたよ。
そして大事だいじなのは、IFイフ文ぶんの条件じょうけんが正解せいかいかどうかってのも、コンピューターの中なかではビットが0か1かっていう事ことで計算けいさんしてるって事ことさ。複雑ふくざつな条件じょうけんを書かいた時ときも、それぞれの条件じょうけんが0か1かに置おき換かわって、そしてその間あいだでANDアンド,ORオア,NOTノットなんてのを使つかって、最終的さいしゅうてきに0か1かになるっていう事ことだよ。
この物事ものごとを0か1かのビットのカタマリで扱あつかうというのを、デジタル処理しょりと言いうぞい!今いまのコンピューターはあらゆる事ことを0か1かのデジタルデータとして処理しょりするから、デジタルコンピューターと言いうんじゃ!
余談よだんになるが、全部ぜんぶ0か1じゃなくて、0.5とか1.33とかもあっていいんじゃない?という処理しょりの仕方しかたはアナログ処理しょりと言いうんじゃ。そしてなんとアナログコンピューターというのもあるんじゃよ。超ちょうウルトラレアキャラじゃがのう。わしも実物じつぶつを見みたことがない!
さて、デジタル、つまり物事ものごとを0か1のカタマリで処理しょりすると何なにが良よいのかというと、ビットの計算けいさんの基本きほんは、論理ろんり演算えんざんなんじゃ。足たし算さん、かけ算さん、割わり算さんなんてのも、実じつは論理ろんり演算えんざんを組合くみあわせて行おこなえるんじゃ。たった3つのカンタンな計算けいさんを組合くみあわせるだけで、ありとあらゆる計算けいさんができるというのがデジタルのすごいところなんじゃよ。
実じつはコンピューターの中なかには、ものすごい小ちいさいランプがものすごくたくさん、何億個なんおくこ何十億個なんじゅうおくこと入はいっていて、そしてそのランプを論理ろんり演算えんざんで計算けいさんする仕組しくみもものすごくたくさん、何億個なんおくこ何十億個なんじゅうおくこと入はいっていると思おもえばええ!まあ実際じっさいのコンピュータに組くみ込こまれている「ランプ」は光ひからんがのう。
ランプのかわりに電気でんきが貯たまっていたら1、電気でんきがなかったら0、という事ことにして、あらゆる事ことを電気でんきのある・なしに置おき換かえて計算けいさんしとるんじゃ!ある・なしだけのデジタルで計算けいさんする方ほうが、ちょっとだけあるとか、すごくたくさんあるとかのアナログで計算けいさんするよりずっとラクなんで、世よの中なかのほとんどのコンピューターはデジタルコンピューターになったんじゃよ。
そしてその論理ろんり演算えんざんのチカラをほんのちょっと借かりて、今回こんかいはIFイフ文ぶんなんかでややこしい条件じょうけんを書かけるという事ことを学まなんだわけじゃ。
それで、論理ろんり演算えんざんの基本きほんは計算けいさん方法ほうほうが3種類しゅるいしかないカンタンな物ものなんじゃが、実際じっさいにややこしい条件じょうけんをこの3つの計算けいさんの組合くみあわせに置おき換かえるというのが、最大さいだいの難関なんかんなんじゃよ。そこはいろいろなパターンや法則ほうそくを覚おぼえて、経験値けいけんちを少すこしずつ上あげていくしかない!まあいつも言いっとるとおり、あせらず少すこしずつ覚おぼえていけばええぞい。



{今回:こんかい}のポイント

ビットについて

Switchスイッチはもちろん、今いま世よの中なかにあるスマートフォン、タブレット、パソコン等などのコンピューターはほとんどすべてデジタルコンピューターです。デジタルとは、データをすべて0か1のビットのかたまりとして扱あつかう事ことを意味いみします。Switchスイッチの中なかのコンピューターはビットを32個こ、または64個このかたまりで取とり扱あつかいます。

論理演算

コンピューターの中なかではデジタルデータの計算けいさんをANDアンド,ORオア,NOTノットのたった3種類しゅるいの論理ろんり演算えんざんの複雑ふくざつな組合くみあわせで行おこなっています。ANDアンド,ORオア,NOTノットそれぞれの計算内容けいさんないようは本編ほんぺんの挿絵さしえを見みて下ください。ANDアンドはビットのかけ算さん、ORオアはビットの足たし算さん、NOTノットはビットをひっくり返かえす計算けいさんだと思おもうと理解りかいしやすいです。

{条件式:じょうけんしき}での{論理:ろんり}{演算:えんざん}

IFイフ文ぶんなどで条件式じょうけんしきを書かく場合ばあいに論理ろんり演算えんざんを使つかって複雑ふくざつな条件じょうけんを書かく事ことができます。ANDアンドは&&、ORオアは||、NOTノットは!を使用しようします。かっこも使用しようできます。
式しきの中なかで&&,||,!を使つかわずにANDアンド,ORオア,NOTノットと書かく事こともできますが、そうすると式しきが違ちがう意味いみになるので注意ちゅういしてください。SmileBASICスマイルベーシックの中なかでANDアンド,ORオア,NOTノットと書かいた時ときに何なんが起おこるかは別べつの章しょうで説明せつめいします。



さて、論理ろんり演算えんざんに少すこし慣なれてもらうために、練習問題れんしゅうもんだいを出だしておこうかの!
その1:PRINT文ぶんがあるじゃろ?あれで論理ろんり演算えんざんの結果けっかもチェックする事ことができるんじゃ。たとえば? 1 && 0とやれば1 ANDアンド 0の計算結果けいさんけっかが出でてくるし、? 1 || 1とやれば1 ORオア 1の計算結果けいさんけっかも出でてくる。NOTノットも同おなじじゃ。? !1とやったら何なんが出でてくるか実際じっさいに確認かくにんしてくれい!そうそう、? A==0とか書かいて、IFイフ文ぶんの条件じょうけんが正解せいかいかどうか簡単かんたんに確認かくにんできるぞい。覚おぼえておくとIFイフ文ぶんのデバッグに便利べんりじゃ。
その2:簡単かんたんなプログラムを作つくってくれい!0から9までの数かずの間まで、3以上いじょう5以下いかの数かずだけPRINT文ぶんで出力しゅつりょくするんじゃ。0から9までというのはFORフォー文ぶんを使つかってFOR I=0 TO 9とかやればいけそうじゃのう。後あとはIFイフ文ぶんとPRINT文ぶんじゃ。FORフォー文ぶんの変数へんすうがIなら、3以上いじょうはI>=3、5以下いかはI<=5と書かけるな。ふたつの条件じょうけんが同時どうじに正解せいかいかどうか調しらべる方法ほうほうは今回こんかいやったのう!3 4 5の3つの数かずが出でてくれば正解せいかいじゃ!
その3:前まえの問題もんだいの逆ぎゃくパターンも作つくってみようかの。0から9までの数かずの間まで、3より下したまたは5より上うえの数かずだけPRINT文ぶんで出だすんじゃ。3より下したはI<3、5より上うえはI>5じゃ。後あとはわかるな?0 1 2 6 7 8 9と7個この数かずが出でてくれば正解せいかいじゃ!
その4:その2とその3ができた人向ひとむけの上級問題じょうきゅうもんだいじゃ!実じつはその3じゃが、その2のプログラムに3文字足もじたすだけでできるんじゃ!足す文字もじは!,(,)じゃ。どうすればいいじゃろうな?ヒントはその3の説明せつめいの最初さいしょ、その3は1その2の逆ぎゃくバターンじゃ。条件じょうけんの正解せいかい不正解ふせいかいをひっくり返かえす方法ほうほうがあったじゃろう?

guide17.txt · 最終更新: 2019/08/30 13:37 (外部編集)

ページ用ツール