誰もが当たり前だと思っている自然の法則や科学の知識。
でもそれは本当なのでしょうか?
答えは, やってみなくちゃ分からない, 大科学実験で。
………
VBA にはビット NOT 演算子がない(ので自分で自作するしかない)みたいな記事を 2 本も観測しました。
ちなみにNotはビット演算とは挙動が違うのでオリジナルを作るしかない。
― VBAでビット演算(論理演算) - t-hom’s diary
気づくと思うけど、ビット反転に相当する「Not」が無い。そこで「ビット反転」をするには、関数を自作する必要があるのです。
― VBA でビット反転など - negationの日記
本文を読むと, 通常論理演算子として扱われるAnd
やOr
の実態がビット演算子であるという認識は共通のようです。 おそらく以下のような推論のもとにこの結論を出したと思われます。
- ビット AND は片方のオペランドが 0 であれば必ず 0 になる。 これは片方が False であれば False になる論理積の動作と合致している。
- 同様にビット OR の動作は片方が True なら True になる論理和の動作と合致している。
- しかし, ビット NOT では True にかけると False つまり 0 にはならない。
- よって
Not
演算子はビット NOT ではない。
一見妥当に見えますが, この推論には以下の「隠れた前提」があります。
- True の内部表現は 1 である。
この前提が正しいかどうか, 以下の式をイミディエイトウィンドウに入力してみましょう。
? True + 0
結果は?
-1
そう, VBA における True の内部表現は -1 なのです。 というよりは, すべてのビットが立っているといったほうが正しいでしょうか。
True が「すべてのビットが立っている」ならビット NOT をかければ「すべてのビットが降りている」状態, つまり 0 つまり False になります。 よって先程の推論は根底から崩れます。
では最後に確かめてみましょう。
? Not 3
-4
はい, Not
はビット NOT 演算子でした。 だから, やってみなくちゃわからない, 大科学実験で。
なお, 件の記事は二本とも 5 年前というかなり古いものですから, 実は当時から挙動が変わった可能性もあります。 四半世紀も放置されていると言われる VBA なのでないとは思いますが…。