2ntブログ

1バイトに複数のデータを保管する

圧縮とかの話ではありません。
1バイトには1つのデータしか保管できないと思い込んでいる人へ、プログラマとして、IT技術者としてステップアップしてもらうためのマメ知識です。

世の中のデータには、文字や音声が画像や様々なものがあります。
コンピュータではこれらのデータを全て数値に変換して保管します。
したがって1バイトには1文字、あるいは最小単位の時間の音声、1ドットの画像データなど1つづつしか保管できません。
これらは0~255までの256種類の、あるいは256段階の数値に変換されて保管されるためです。

しかしデータの中には、たった2種類しか必要としないものもあります。
例えばインターネットで何か会員登録する場合、男か女か、既婚か未婚か、メールマガジン配信の要・不要などは、数値に変換しても0か1か2種類で表せます。
こういったデータは1バイトの中に複数保管する事が可能です。

なぜなら1バイトは2進数8桁で構成されているからです。
つまり1桁目は性別、2桁目は既婚・未婚、3桁目はメールマガジンの配信の要・不要などというように2進数を使った保管をすれば、8桁分、つまり8個分の2択データを1バイトに保管できるのです。

フラグデータ

図で表すとこんな感じでしょうか。

こういった0か1かで表せるタイプのデータを「フラグ」と言ったりします。
「俺、この戦争が終わったら結婚するんだ・・・」は死亡フラグとして有名ですが、あの「フラグ」も同じ意味ですw
この台詞を言ったか言わないかで、その後のキャラクターの生死が別れるわけですが、この言ったか言わないかという2択のデータなので、「フラグ」なのです。

さて、このようなタイプのデータを実際に保管したり、保管状況を調べたりするにはどうしたら良いでしょうか?

コンピュータの開発言語には、様々な命令(コマンド)があります。
その中にビット演算という種類のものが、たぶん大抵の開発言語にはあるはずです。
フラグ形式のデータを扱う場合は、このビット演算を使います。

ビット演算は

任意の変数 ビット演算命令(記号) 任意の数値又は変数

という形式で書きます。

ビット演算命令には

・AND
双方のビットが1の場合のみ、計算結果のビットが1になる
1 AND 1 =1
0 AND 1 =0
0 AND 0 =0

・OR
双方のビットが1又は片方が1の時、計算結果のビットが1になる
1 OR 1 =1
0 OR 1 =1
0 OR 0 =0

・XOR
双方のビットが異なる場合のみ、計算結果のビットが1になる
1 XOR 1 =0
0 XOR 1 =1
0 XOR 0 =0

の3種類が主に使われます。

1桁目のビットだけONにしたい場合は、
A=A OR 1
1桁目のビットだけOFFにしたい場合は、
A=A AND 254

1桁目のビットがONかOFFか調べたい場合は、
IF A AND 1 THEN ~
などのように書けばAの他の桁がどんな状態でも、1桁目が0なのか1なのかを判別させる事ができます。
ちなみに通常BASICなどは、ANDという英単語がビット演算命令ではなく、条件追加の意味だったりする事もあるので、詳しくはお使いの開発言語のリファレンスを見てください。

なお10進数表記でビット操作する場合、2進数⇔10進数の概念というか計算ができる必要があります。
基本的に2進数は1桁目から8桁目まで、それぞれが1だった場合、
1・2・4・8・16・32・64・128
という具合に10進数だと倍の数字になっていきます。
なので例えば1桁目と3桁目が1の場合は、1+4で10進数だと5になります。
つまりA=A OR 5 とした場合は1桁目と3桁目のビットが必ずONになるという事です。
1桁目が0でそれ以外が全部1の場合の8ビットデータは10進数に直すと255-1で254です。
(8ビットすべてがONの場合は10進数では255というのを覚えていれば、1桁目のビット分の数値をそこから引けば良いと分かると思います)
よってA=A AND 254とした場合は1桁目だけが必ずOFFになるという事です。

フラグ化できるデータをこのような方法で使うと、プログラム実行時のメモリやデータ保管時のHDDの容量が節約できるばかりでなく、動作スピードも速くなります。

ファミコンや8ビットCPUのパソコンしか無かった時代のプログラマは、全員知っていた方法です。
なぜならその時代はメモリはめちゃくちゃ少ないし、CPUもめちゃくちゃ遅かったので、少しでも少ないメモリで高速動作するように、プログラムを組む必要があったからです。

どんな初心者・ド素人が作ったプログラムても、豊富なメモリと有り余るCPUパワーで動作してしまうのが今の時代ですが、こういった知識・テクニックを知っているのと知らないのでは、差がつきます。

精進して下さい。

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR