プチコンまとめWiki (初代/mkII)

Mame/ビット演算とは の変更点

パンくずリスト


#title(ビット演算とは?)
#title(ビット演算とは)
#contents

//編集お願いします

*ビット演算って? [#lddafc3f]
二進数を個々のビットの列として操作することです。

**二進数って? [#h6aaef2f]
二進法とは、日常で使われる10で1つ位を上げる十進法に対し、2で1つ位上げる方式のことです。~
ですので&basic{0};→&basic{1};→&basic{10};→&basic{11};→&basic{100};→&basic{101};→&basic{110};→&basic{111};・・・と数がふえていきます。~
そして、この方式で表された数のことを二進数といいます。~
ただ、二進法の10と十進法の10は見分けがつかないのでプチコンの場合、頭に&basic{&B};を付けて表します。~
例)
#basic{{
?"&B101=";&B101
}}
このように打つと&basic{&B101=9};と表示されます

**ビットって? [#lce13c76]
この場合、二進数の桁1つ1つをさします。~
ちなみに、「0=OFF」「1=ON」となり 0が1になることを「ビットが立つ」と言うことがありますが、特に覚える必要はありません。~
//「フラグが立つ」もこれが由来です。
//また、ビット8つが集まったものをバイトと言います。1バイト=8ビットです。


*ビット演算子 [#efd77958]
ビット演算子とは「+」「−」「×」「÷」などと同じように数を操作する記号のようなものです。~
ビット演算子にはいくつかありますので1つずつ解説していきます。

**NOT [#ff17dafb]
''2つの数をくらべるのではなく0と1をひっくり返す''のがNOTを使ったビット演算です。~
まずはこのように編集モードで入力して&basic{RUN};してください。
#basic{{
A=NOT 6
PRINT A
}}
すると6は二進数で
#basic(noline,whitesmoke){{
00000000000000000110
}}
なのでそれぞれの位の0と1をひっくり返すと
#basic(noline,whitesmoke){{
11111111111111111001
}}
となり十進数に直すと&basic{-7};となるので
#basic(noline,black){{
-7
}}
//修正しました
と表示されます。~
~
※ちょっと待ったあああ![[「0b11111111111111111001を十進数で」でググる:http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADFA_jaJP410JP424&q=0b11111111111111111001%e3%82%92%e5%8d%81%e9%80%b2%e6%95%b0%e3%81%a7]]と1048569と出たぞ!おかしいじゃないか!~
 というそこのあなた、ごもっともです。しかし、ここには「2の補数」「符号ビット」という考え方が必要になりますので、後述します。

**OR [#cc375b15]
''どちらかでも1がある位は、1になる''のがORを使ったビット演算です。~
まずはこのように編集モードで入力して&basic{RUN};してください。
#basic{{
A=5 OR 6
PRINT A
}}
すると5は二進数で
#basic(noline,whitesmoke){{
101
}}
6は二進数で
#basic(noline,whitesmoke){{
110
}}
となりどちらかでも1がある位は、1にするので
#basic(noline,whitesmoke){{
   101
OR 110
------
   111
}}
となり十進数に直すと&basic{7};なので
#basic(noline,black){{
7
}}
と表示されます。

**XOR [#u1526d10]
''両方とも1になっている位は0になり、片方にだけ1がある位は1になる''のがXORを使ったビット演算です。
まずはこのように編集モードで入力して&basic{RUN};してください。
#basic{{
A=5 XOR 6
PRINT A
}}
すると5は二進数で
#basic(noline,whitesmoke){{
101
}}
6は二進数で
#basic(noline,whitesmoke){{
110
}}
となり両方とも1になっている位は0になり、片方にだけ1がある位は1になるので
#basic(noline,whitesmoke){{
    101
XOR 110
-------
    011
}}
となり十進数に直すと&basic{3};なので
#basic(noline,black){{
3
}}
と表示されます。

**AND [#ua39fe7a]
''両方とも1になっている位だけ、1になる''のがANDを使ったビット演算です。
まずはこのように編集モードで入力して&basic{RUN};してください。
#basic{{
A=5 AND 6
PRINT A
}}
すると5は二進数で
#basic(noline,whitesmoke){{
101
}}
6は二進数で
#basic(noline,whitesmoke){{
110
}}
となり両方とも1になっている位だけ、1になるので
#basic(noline,whitesmoke){{
    101
AND 110
-------
    100
}}
となり十進数に直すと&basic{4};なので
#basic(noline,black){{
4
}}
と表示されます。

*符号ビットって? [#dabdebd9]
符号ビットとはその数値の正負を表すものになっています。プチコンでは符号ビットが整数部の20ビット目に割り当てられています。~
符号ビットが1のとき、その数は「符号ビット以外の数値-524288」となります。ただし、-524288という数字はプチコンのシステム上存在しないので、&basic{&B10000000000000000000};と打つと-0という謎の数値が出てしまいます。(詳細はまめちしきへ)~


*ビット演算の使用例 [#h197c010]
ここまでビット演算について説明してきましたが実際に役立たなければいみがありません。~
ここからはビット演算の具体的な使用方法について説明していきます。

**BUTTON()命令 [#sa61c955]
このようなプログラムを見たことがあるとおもいます。
#basic{{
B=BUTTON()
IF B AND 16 THEN BEEP 1
}}
このプログラムの意味は もしAボタンが押されたらBEEP 1を鳴らすという意味です。~
実はここに&basic{AND};がつかわれています。なぜでしょうか?
実は&basic{BUTTON()};命令に使われてる値を二進数に直すとこうなります。



|RIGHT:ボタン|RIGHT:10進数|RIGHT:2進数|
|RIGHT:&basic{↑};|RIGHT:&basic{1};|&basic{000000000001};|
|RIGHT:&basic{↓};|RIGHT:&basic{2};|&basic{000000000010};|
|RIGHT:&basic{←};|RIGHT:&basic{4};|&basic{000000000100};|
|RIGHT:&basic{→};|RIGHT:&basic{8};|&basic{000000001000};|
|RIGHT:&basic{А};|RIGHT:&basic{16};|&basic{000000010000};|
|RIGHT:&basic{Б};|RIGHT:&basic{32};|&basic{000000100000};|
|RIGHT:&basic{Ф};|RIGHT:&basic{64};|&basic{000001000000};|
|RIGHT:&basic{Х};|RIGHT:&basic{128};|&basic{000010000000};|
|RIGHT:&basic{К};|RIGHT:&basic{256};|&basic{000100000000};|
|RIGHT:&basic{н};|RIGHT:&basic{512};|&basic{001000000000};|
|STARTボタン|&basic{1024};|&basic{010000000000};|
|SELECTボタン|&basic{2048};|&basic{100000000000};|
つまり
Aボタンが押されている時、16のビットが1になり
#basic(noline,whitesmoke){{
    10000
AND 10000
---------
    10000
}}
IF以下の命令が実行されます。(IF命令は条件式が0以外の時に実行される)

この時にBボタンが押されていると、32のビットが上がるので
#basic(noline,whitesmoke){{
     10000
AND 100000
----------
    000000
}}
となりIF以下の命令が実行されなくなります(IF〜THEN〜ELSE分の場合ELSE以下の命令が実行される)

/////////////////////////////////

* CHECKER FLAG (ひとことコメント) [#y7e6aa7e]
コメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は[[掲示板>Board]]へ)

#comment

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.005 秒 | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30