ふと、ビット演算をしようとしたとき、68000時代にはまったことを思い出した。
基本的に VB.net や C# (や C,C++ ) には算術シフト演算子しかなくて、論理シフトはできない。
論理シフトがしたい場合、unsigned な変数に入れてやる必要がある。
以下はその例。2つのブロックはともに &H8000 からシフトしているが、上下で結果が異なる。
論理シフトのつもりでシフト演算式を使っているとある領域(要はマイナス)のときに混乱するので要注意。
結果
算術シフト 8000 (-32768) C000 (-16384) E000 ( -8192) F000 ( -4096) F800 ( -2048) FC00 ( -1024) FE00 ( -512) FF00 ( -256) FF80 ( -128) FFC0 ( -64) FFE0 ( -32) FFF0 ( -16) FFF8 ( -8) FFFC ( -4) FFFE ( -2) FFFF ( -1) FFFF ( -1) 論理シフト 8000 ( 32768) 4000 ( 16384) 2000 ( 8192) 1000 ( 4096) 800 ( 2048) 400 ( 1024) 200 ( 512) 100 ( 256) 80 ( 128) 40 ( 64) 20 ( 32) 10 ( 16) 8 ( 8) 4 ( 4) 2 ( 2) 1 ( 1) 0 ( 0)
コード
Imports System.Console Module Module1 Sub Main() WriteLine("算術シフト") Dim s As Short = 1 s <<= 15 For nLoop As Integer = 0 To 16 WriteLine("{0,4} ({1,6})", Hex(s), s) s >>= 1 Next WriteLine("論理シフト") Dim u As System.UInt16 = 1 u <<= 15 For nLoop As Integer = 0 To 16 WriteLine("{0,4} ({1,6})", Hex(u), u) u >>= 1 Next End Sub End Module