左シフトと右シフト

BASICVBAの「オーバーフロー」などについて興味も関心もないが、それについて考えてみたのは次のような「検索」があったからである。エクセルバカの貧弱なアタマ、シフトの意味も知らない低能のオバカたちが何をしようというのか、そのほうがよほど興味がある。「子どものオモチャ」のVB/VBAからすれば、ビット、バイト、シフト、バイナリなどの言葉だけをどこかで拾ってきて「大人の世界」をのぞきたがるということであろうか(笑)。
LOG
192.218.140.238 [06/Jan/2020:12:39:57] ipc_0103 VBA シフト演算 オーバーフロー
この時、VBAには「シフト演算」というものがないはずだがと思って、チラチラと骨董ソフトのExcelを見てみた。少し前までは確かに「シフト演算」というものがなかったが、今は少し状況が変わっているようである。

以下では、&H611B (= 24859)&H4B00 (= 19200) という数値を使って左シフトと右シフトをやってみよう。

左へビットシフトする

&H611B (= 24859) を1ビットずつ左シフトする。



2進法(数)で桁が1桁ずつ繰り上がっていくことになる。先頭は既存の状態のままで、末尾に0が追加される。簡単に言えば、2進法だから数値が倍々ゲーム的に増えていくだけのことになる。この実行例では先頭に0を追加して桁数を揃えている。いわゆるゼロパディングしている。

このパターンでいくと、いずれDouble型の数値の範囲を超えることは確実で、その時はBASICでは「オーバーフロー」のエラーが起こることになる(推測)。


右へビットシフトする

&H4B00 (= 19200) を1ビットずつ右シフトする。



2進法(数)で桁が1桁ずつ繰り下がっていくことになる。先頭は既存の状態と変わらない。簡単に言えば、2進法だから数値が半々ゲーム的に減っていくだけのことになる。この例では末尾の0だけが消えていく
このパターンでいくと、いずれ数値は0になっていくことになるのだろう。


ビット操作

BASICにもAnd, Orなどの演算ができる。となると、C言語的なビット操作ができるのかもしれない。もっとも、この程度では実用性はほぼないだろう。しかし、これはヒマなときにでもやってみよう。今はここに深入りする気はない。
たとえば、ipc_0103で[論点]としてあげた次のような例にもこの左シフト・右シフトの組み合わせで対処することができる。
参考
16進数の ABCD (10進数では43981) と 1234 (10進数では4660) の2つの数がある。
これらから、CD12 (10進数では52498) と 34AB (10進数では13483) という数値を作ることである。
ここでの方法を使った実行例は下記の「ビット操作の例(vba_0118)」を参照。
しかし、いつもながらBASIC独特の「おかしな仕様(vba_0117)」には悩ませられることよ。C言語的な操作感覚でいくと原因不明の誤動作が出てくる。

- 2020/01/19 -





WSF_01.bas@Vba1.xlsmに所収。


左シフトと右シフト(vba_0116)
ビット操作の落とし穴と検討(vba_0117)
ビット操作の例(vba_0118)
C/C++とBASIC/VBAのオーバーフローの比較(ccp_0381)




Unicode,UTF-8,UTF-16,Big,Little,Endian,LE,BE,Shift_JIS,SJIS,CR,LF,CRLF,byte,bit,word,CSV,BOM,Encode,Decode,ANSI, Binary,Open,Byte,Get,Put,Input,InputB,Asc,AscB,AscW,Chr,ChrB,ChrW,Hex,Mod,EOF,LOF,Loc,FreeFile,ReDim,Encoding, Left,LeftB,Right,RightB,Mid,MidB,Len,LenB,InStr,InStrB,FileSystemObject,FSO,CreateTextFile,OpenTextFile,Line Input #, バイナリ,テキスト,文字列,文字コード,16進コード,16進文字列,変換,ビッグ,リトル,エンディアン,ユニコード,改行,サンプル, バイト,ビット,ヘキサ,2進数,16進数,読み込み,書き込み,エンコード,デコード,解析,変換,判定,判別,バイナリエディタ, 全角,半角,カタカナ,ひらがな,漢字,