logo

logo

メールマガジン・新着情報一覧

  1. TOP
  2. メールマガジン・新着情報一覧
  3. A-0085. ビット演算の奥深さ — TT

2018.10.10

A-0085. ビット演算の奥深さ — TT

◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

ビット演算の奥深さ

発行:エスオーエル株式会社
http://www.sol-j.co.jp/

連載「X線CTで高精度寸法測定!?」
2018年10月10日号 VOL.085

平素は格別のお引き立てを賜り、厚く御礼申し上げます。
X線CTスキャンによる精密測定やアプリケーション開発情報などをテーマに、
無料にてメールマガジンを配信いたしております。

◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇



タイトルに「ビット演算の奥深さ」と書きましたが、
最初に断っておくと、ビット演算の奥深さを語れる程、
ビット演算に精通しているわけではありません。

逆に、ビット演算に詳しくないから、
ちょっとしたことを知っただけで、「奥が深いなぁ」と
感心することが多々あります。

どちらかというと、ビット演算なんて所詮、
基本的な演算の法則があって、それを組み合わせるだけだから、
原理さえ知っておけば、理解できないことはないはずだし、
大したものではないと高を括ってしまうタイプです。

しかし、習熟した人から見れば非常に簡単なことで
頭を抱えてしまうことがあり、ようやく理解したときには、
自分の無知とレベルの低さに呆れてしまいますが、

そのようにして習得した知識や考え方は、宝物のようであり、
学ぶことを止められない高揚感があります。

そして、いとも簡単に忘れてしまう悲しさもあります。
せっかくの宝物を失った気分ですが、
諦めずに繰り返し触れていると、容易に取り戻せるようになり、
最終的には定着します。


ビット演算を語るには、デジタル論理の話や二進法の話を
しなくてはなりません。

二進法というのは、数字を 0 と 1 で表記したものです。

コンピュータは、全てを 0 と 1 で処理しているというのは、
有名な話です。

中学生の頃、機械語やアセンブリ言語に熱中していたときがあります。
その頃は、32ビット CPU と直接お話している感じがあり、
とても楽しかった思い出になっています。

その後、C言語に移行すると、できることが格段に増えて、
機械語やアセンブリ言語とは疎遠になっていきました。
でも、そこで培った考え方は、他のプログラミング言語でも
役に立っていますし、今の仕事でも役に立つ基礎となっています。

そして今は、intel Core i7 とお話している気分が全然味わえません。

64ビット CPU を使う際の Windows のような OS が
あまりにも大きくなり過ぎて、CPU が遠い存在になっています。
今、どのレジスタにどんな値が入っているかなんて、想像もできません。

少し悲しいですが、
C++, C#, Python, Lisp などなど、魅力的な言葉が多いので、
機械語に戻っている暇はほとんどありません。


でも最近は、装置のサーボコントローラにコマンドを投げることが多く、
デジタル機器とお話している気分は多少味わっています。

このようにして、今回は思い出話で終わってしまいそうです。
なぜなら、「ビット演算」の解説をこのメルマガでしても面白くなく、
知りたければ、Wikipedia を調べる方がよっぽど良いと思うからです。


それでは最後に、
冒頭で触れた、頭を抱えるようなビット演算を紹介します。

「もし、x の一番右の 1 というビットを 0 にしたければ、

   x AND (x - 1)

 という演算をしなさい。」


これは、ある有名な本の(実質的な)最初のページに出てくる式です。

まず、日本語で読んでも意味が分からない。
自分の持っている英語の原書を見ても意味が分からない。
このようなコンピュータの専門書は、下手に日本語訳を読むより、
英語の方が分かりやすいはずなのに、いずれにしても難解なのです。

例として、「01011000」がこの演算で「01010000」になる
という説明を読むと、さらに混乱する。

実は、分かってしまえば、大したことはないのです。

0 と 1 が並んでいますが、例の右から4番目が、
一番右の 1 なので、これを 0 にするという演算です。

01011000 - 1 は、繰り下がりがあるので、01010111 になります。

そして、AND は、1 AND 1 = 1 で、それ以外が 0 なので、

  01011000 AND (01011000 - 1) = 01011000 AND 01010111 = 01010000

という計算になり、
めでたく一番右の 1 というビットだけが 0 に切り替わるのです。

1を引くことで、繰り下がりがあって、1000 の部分が 0111 となり、
AND で上手くその部分全てを 0 にしていくという形なので、
一般的に成立する公式として証明できます。


一見難しいものが、分かってしまえば大したことはない
という話をしたかったのに、結局分かった人にしか分からない
説明になってしまいました。

ビット演算の専門書は、冒頭からこのような調子で、
x AND (x + 1) とか、¬x AND (x + 1) とかが出てきて、
x XOR y = (x OR y) - (x AND y) のような公式を駆使して
問題を解いていきます。


AND とか OR とか、デジタルの基礎の基礎を知って、
後は原理的に理解できるはずと、全てを分かった気になっていると、

幸運にも縁があれば、こんなに奥が深かったのかと、
あるとき驚く日が来ます。


--
高野智暢


----------------------------------------------------
◎以下の展示会に出展します◎

・JIMTOF2018(第29回日本国際工作機械見本市)
   日程:11/1(木)~11/6(火)
   会場:東京ビッグサイト東7ホール【E7007】 
---------------------------------------------------- 

一覧に戻る

お問い合わせ Contact

048-441-1133

お問合せフォーム