空腹おやじのログと備忘録

VBA(主にExcel)でいろいろな実験的な事とか、Linuxのコマンドとか設定とかについて忘れないように、あれこれと・・・

【VBA】割り算を使わないで、数値の2進数表示を取得する(負値対応済み)

最初に断っておきますが、この記事は半分ネタです。
あえて、面倒くさいことしてます。
私がやりたかっただけです。

基本に則って2進表示を求めたい方は、

とか、して下さい。

但し、10進数の2進数表示した文字列を取得する関数は、探せば結構出てきますが
大体は、2で割って余りを求めて・・・
でも、負の数まで考慮されているものはほとんど無いようです。
私が見つけた1件でも、値によってはオーバーフローして、十分な検証はされていないようでした。

WorksheetFunction.Dec2Bin は、

数値 < -512 または数値 > 511 の場合、エラー値 #NUM! が返されます。

WorksheetFunction.Dec2Bin メソッド (Excel)

と、あまり使い物にならないかもしれません。

コード その1

割り算を使った方法は、上位の桁から処理していくが、割り算を使用しないということは、その逆で、下位から処理を行っていきます。
2^0 の桁 から Integerなら、2^15 の桁に向かって処理を行います。

流れとしては
最初に、変換したいデータと 1 ( = 2^0 )のAnd を取る。

奇数の場合、2^0の桁は 1 なので
1 And 1 ===> 1
となり、
偶数の場合、2^0の桁は 0 なので
0 And 1 ===> 0
となる。

And を取った結果が、2^0 の桁の値となる。

これを桁を、2^1の桁、2^2の桁と、上位方向にずらして繰り返していく。

「And演算子って何?」とか、
「なんで数値同士でAndなの?」とか
「A And B って、A かつ B じゃないの?」
という方は、以下のリンクをどうぞ。
解説の下の方に書いてあります。)
docs.microsoft.com


以下が、その処理を行うコードです。
但し、Integer も Long も符号付き故に、大抵は、最上位bitでの処理に苦しみます。(多分、私だけではないと思う。)
結局は、それを回避するためにゴチャゴチャと・・・

Long(32bit 符号付き)版のコードは、必要最小限にコメントを省いているので、コメントが必要な方は、Integer(16bit 符号付き)版のコメントを参照して下さい。
微妙に違うところはありますが、ほぼ分かると思います。

コード その2

VBAで、エンディアンの変換をやろうとしたら、やっぱりハマった - 空腹おやじのログと備忘録 のおまけで書いたコードと似たような手法。

最初に変換したい値を16進の文字列に変換して、16進数1文字につき、2進数4文字に変換していく。
値の正負を意識する必要がない。
オーバーフローの心配もなく、手っ取り早い。

お気軽に使いたいなら、こちらの方がおすすめ。

Integer(16bit)版のみ掲載
Long(32bit)版が欲しい方は、適当にアレンジして下さい。そんなに難しくはないと思いますので。


あぁ、今日も自己満足の世界に・・・