コラム / 関数紹介 / 1bit単位でデータ操作してみる


コラム/関数紹介

実装はこんな感じ(いいかげん。実用性皆無)
読め。そして理解せよ

function BitRead(const X:integer;From:integer;Count:integer):integer;
begin
if Count=0 then begin result:=0;exit;end;
result:=((X and(1 shl From))shr From)+(BitRead(X,From+1,Count-1)shl 1);
end;

procedure BitWrite(var Dest:integer;From:integer;Count:integer;Data:integer);
begin
Dest:=(Dest xor(BitRead(Dest,From,Count)shl From))or(Data shl From);
end;


口上。
プログラミングにおいて1Byteというものがデータの最小単位として扱われがちあるが
ここで1Byte=8bitということを思い出してもらいたい
8bitというとOn/Offのスイッチが8つ、実に256通りもの表現ができる
すなわち1Byteの変数には
0〜255の数を1つ
0〜15なら2つ
0〜3なら4つ
0〜1なら8つ
あるいはそれらのデータを複合して内包できるのである

例1.ある人の性別と年齢
通常127歳を超えて生きる人はいない
同様に性別を決定できない真性半陰陽の人もまずいない
とすると上位1ビットを0=男,1=女で性別
下位7ビットに0〜127歳で年齢としてみれば1Byteにおさめて表現が出来る

例2.Wizardryにおける現在地表現
階層、0〜10(0=Castle)
x座標、東に0〜19歩
y座標、北に0〜19歩
向いている方角、東西南北(0〜3で表現)
これをそれぞれ4bit、5bit、5bit、2bitずつ割り当て計16bit=2Byte=WORD変数1個におさめることが出来る


記憶装置の容量が巨大化した現在においてこのようなことをする意味は無いだろう
むしろ処理効率も低下しいいことなしである
ただ時々は変数として確保されてからずっと0のままのビットに思いを馳せてみてもいいんじゃないかなという提案でした