[算法] 算術シフトと論理シフト

2010年5月20日

 ふと、ビット演算をしようとしたとき、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





カテゴリー: Program, VB.NET, アルゴリズム, 情報技術

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org