「bit」を考えてみる

これが「4ビット」と、その値になります。このビット数が倍になると「8ビット」で「1バイト」になります。4ビットでは「0」から「15」までの16通りの値を取ることができます。

よって、8ビットだと「16×16=256」までの値をとりうるわけです。

これを「AND」にすると「0」になり、「OR」にすると「0110=6」になります。「XOR」でも「6」になります。

これを「AND」にすると「0010=2」になり、「OR」にすると「0110=6」になります。「XOR」だと「0100=4」になります。

XOR」は状態の変化をとらえることができます。「000000000111111111111」のようなビット信号が来た場合、「0→1」の1パルスだけをキャッチすることができます。その逆も同じで「1→0」の1パルスだけをとらえることができます。

ビット演算で重要なこととして「シフト」があります。

このビット列を左に1ビットシフトすると「1100=12(C)」となります。同様に右へ1ビットシフトすると「0011=3」になります。つまり、左へシフトすると「」になり、右にシフトすると「半分」になります。

ビット演算は速度が速いので昔は普通に使っていましたが、ビットのオーバーフローなども管理しなくてはならないので面倒ではありましたが、いまでは、高級言語にお任せで速度の向上はマシンに依存すればいい時代になりました。

「マスク」処理も早かったのでフラグにビットを対応させたりしました。特にグラフィック関連では速度が命なのでこのようなことをしましたが、CPU自体が早くなり、レジスタが64ビットになり、CPUがコア5とか7とかになってくれば、アプリが対応してさえいれば並列処理もパソコンで可能になってきています。

そこにメモリを32GBとか64GB積むようになればビット演算などする必要はきっとないのでしょう。

おまけの話

昔のコンパイラには「速度優先」と「サイズ優先」というコンパイル時のオプションがありました。それは、メモリのアドレス参照の仕方の問題で、相対アドレスの命令は2バイトのところ絶対アドレスの命令が3バイトでした。現在位置から次に参照するメモリアドレスを指定するほうが命令のサイズが小さいだけサイズを小さくすることができますが、ハンドアセンブルするようなケースでは、常に相対的に参照するアドレスを追いかけなくてはならないので結構面倒でした。

絶対アドレス指定だと命令のサイズが大きいのですが、常に起点から指定アドレスを参照するだけなので速度が速くなりますがサイズが大きくなります。

人生は、相対アドレス指定でしか生きられません。現在の立ち位置から次の立ち位置へと移動していくうちに考え方や価値観も変わっていきます。それが「」の生き方であるのか「」であるのかは、生きてみないとわかりませんし、所詮、人生は二通りには生きられないので「」も「」もないと言えそうです。

堀田正睦が佐倉城に帰って「こんなはずじゃなかった」とつぶやくのは佐藤正美の「開国」ですが、プーチンも同じ思いでいるのでしょう。相対アドレスゆえの悩みなのかもしれません。