+ | ■2進法・bit数値の読み方・32bit-Int型について |
■2進法・bit数値の読み方
2進法は使う数字が0と1しかないため1+1で一桁上がり10となる。
十進法での2が10、4が100、8が1000、16が10000、32が100000、 64なら1000000、128=10000000、256=100000000、512=1000000000、 1024=10000000000、2048=100000000000、~という具合。 コンピューターではこれらを組み合わせることで大きな数値を記録します。
■bitの動き
33+4=37という計算をbitで見ると以下のようになる。
足した桁が0であればそのまま1が入る。1の場合は
合わさった箇所の桁が1つ上がる。
もちろん上がったbit桁の部分1ならさらに繰り上がりが発生する。 反対に89-24=65という計算のbitを見ると以下のように。
マイナスなので丁度bitの重なる桁は0になっている。
0の部分をマイナスした場合は、
上側の一番近い1の桁を0にしその1つ下の桁からマイナスした桁まで1にする。
なお、上側に1がない場合は特別な状態となる。 ■32bit-Int型について
32bitの内、31bitまでは通常のbit演算だが、
bitの32桁目は-2147483648という数値になっている。 32bit全てが1の場合は、2147483647-2147483648となり-1の数値になる。
bitの32桁目は-2147483648のため、31桁目までの2147483565と合わせ
2147483565-2147483648=-83という状態として処理される。 ならもし31bitまで1の数値、2147483647に+1したら?
オーバーフローを起こし、マイナス数値に転じてしまう。
なお最初から最大値を超過している場合は、最大値まで補正される。 オーバーフローが起きるのは計算によって超えた場合のみ。 ちなみに-1へ+1すると0になる。
なお過度のオーバーフローはシステム上なるべく避けたほうが良い。
バグなどを引き起こす可能性もある ■2の冪(べき)
2進法の性質上bitの全ての桁は2の累乗数を表している。
1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192…という具合。 その為2倍にするとbitの桁が全て1つ上がり (1桁目を除き)2で割るとbit桁が全て1下がるという性質を持つ。 例えば、29で比較してみると
この2の5乗で乗算するということは、5回分2倍にするのと同じ計算になる。
そして、掛け算は同じ数の割り算で戻す事ができるように、 bitでも、2で割れば1桁下がり・2の累乗数で割ればその分bitは下の桁へスライドする。
:|
:|
ただしMUGENでは小数が出た場合はbit管理はbit演算の使えないFloat型に切り替わるため、 bit用の割り算には2の累乗数以外を使ってはならないし、 用いる数値のbit桁未満の数値が存在しないことがMUGEN内では前提となる。 一応、小数が出てもT-/Floor()などで切り捨てれば、 1未満になった桁を省くことはできるが、数値そのものが不安定になるので避けるべき。 ■剰余と切り捨て
剰余(割り算の余り計算・MUGENでは演算子「%」)を用いると、
Floor()と%剰余演算を組み合わせれば
「特定した桁範囲のbitのみを取り出す」こともできるが、 そうした計算はbit演算子を用いるほうが確実である。
Float型になると細かい数値が浮動する危険もあるので可能な限りInt型の方が良い。
次の項でbit演算についてを解説する。 |
+ | ■bit演算の読み方 |
■bit演算の読み方
bit演算とはbitの0,1自体を比較する演算であるわけだが、
mugenで使用出来る演算子は3種類。 「 & 」「 | 」「 ^ 」
基本的に計算式のように左右に数値を置いて使うのだが、
基本的には|orと&andしか使わないが、^も応用方法はある。
|
+ | ■32bit-Int型の表 |
■32bit-Int型の表
後述するものには不可欠なもの。
単一の基本値であればFloor(2.0** xbit桁数-1x )でbit住所の代用は可能。 基本的には十進法と2進法との互換性を持った電卓ソフトを併用する。 |
+ | ■Var-桁数分割方式について |
bit演算はvarの分割管理に有用なのだが、少し補足。
■桁数分割管理について。
T-/Var()に入れる情報を桁数で分割して
単一のVarに複数の情報を入れられるようにすることを Varの分割管理、桁数分割管理などと呼ぶ。Var圧縮とも。 代表例はT-/Floor()・/・%を用いて十進法の桁数を分割管理する通常の桁数分割管理。 ■Var-bit桁数分割方式について
入れる情報をbitの桁数で分割してより無駄なく使うのがbit桁数分割方式。
原理としてはbit桁数で別々に管理するようにする方式で、 bitを1~10・11~20・21~30桁目と分ければ10bit(0~1023)の情報を3つ記録できる。 もちろん10bitずつだけでなく5bit×2と20bitといった組分せも可能。
とはいえ1bitずつフラグ管理に使われるのが主。
大量Varでフラグ管理をしていてVarの余りが少なくなるような場合は必須。 ■通常の桁数分割とbit桁数分割の違い
「1か0」のフラグ管理は通常の桁数分割だと10+1個までしか管理できないが、
bitには「1か0」を記憶する桁が31+1個あるのでおよそ3倍もの数を管理ができる。 また0~1000までの数値も桁数分割では2個しかはいらないが、bitなら3個も入る。 :| とは言え桁数分割の方の10分割は0か1が1個+0~9が9個それぞれの情報量は多く、 2分割なら0~9999まで+0~213747までの数値と、かなりロスが出ているのだが。 特に通常の桁数分割方式の場合、0~4までを9個・0,1(5)を10個・+-という分割も可能で、 この場合、bitに換算すると3bitクラス×9+1bit×11と38bit分もの情報である。 (0~4の管理に3bitでは5~7のロスが生じ、それが9個重なり、6bitの差となっている。) fvar、Float型とbit演算
Float型は32bit-Int型と同じ32bitの情報だが形式は全く異なり、
その為、基本的にFvarでbit演算を行うことはない。
なおFloat型・Fvarでも2の冪であれば、2の31乗まで確実に記録することができる。 |
+ | ■Var-bit桁数分割方式・使い方 |
■Var-bit桁数分割方式・使い方
■上記の解説
■数値の直打ちについて
■bitの動きの例
|
+ | ■bit分割Var用Var表・txtファイル用 |
■bit分割Var用Var表・txtファイル用;Var表用の32bit分割表 bit住所値付き
;Var(**)1 =(1) = ;--bit--2 =(2) = ;--bit--3 =(4) = ;--bit--4 =(8) = ;--bit--5 =(16) = ;--bit--6 =(32) = ;--bit--7 =(64) = ;--bit--8 =(128) = ;--bit--9 =(256) = ;--bit-10 =(512) = ;--bit-11 =(1024) = ;--bit-12 =(2048) = ;--bit-13 =(4096) = ;--bit-14 =(8192) = ;--bit-15 =(16384) = ;--bit-16 =(32768) = ;--bit-17 =(65536) = ;--bit-18 =(131072) = ;--bit-19 =(262144) = ;--bit-20 =(524288) = ;--bit-21 =(1048576) = ;--bit-22 =(2097152) = ;--bit-23 =(4194304) = ;--bit-24 =(8388608) = ;--bit-25 =(16777216) = ;--bit-26 =(33554432) = ;--bit-27 =(67108864) = ;--bit-28 =(134217728) = ;--bit-29 =(268435456) = ;--bit-30 =(536870912) = ;--bit-31 =(1073741824)= ;--bit-32(-2147483648)= ;範囲用 ;-bit-xx-xx=(&x範囲値x)/x場所値x= |