メールマガジン・新着情報一覧
- TOP
- メールマガジン・新着情報一覧
- A-0085. ビット演算の奥深さ — TT
2018.10.10
A-0085. ビット演算の奥深さ — TT
◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ ビット演算の奥深さ 発行:エスオーエル株式会社 https://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】 ----------------------------------------------------