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パワーで動作してしまうのが今の時代ですが、こういった知識・テクニックを知っているのと知らないのでは、差がつきます。
精進して下さい。
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パワーで動作してしまうのが今の時代ですが、こういった知識・テクニックを知っているのと知らないのでは、差がつきます。
精進して下さい。