算術ビットシフトは間違ってるかもしれませんが。
Option Explicit
'-----------------------------------------------------------
' definition
'-----------------------------------------------------------
Dim g_aryPower
Dim g_aryMask
Dim g_aryRevMask
'2^i
g_aryPower = Array( _
&H1&, &H2&, &H4&, &H8&, _
&H10&, &H20&, &H40&, &H80&, _
&H100&, &H200&, &H400&, &H800&, _
&H1000&, &H2000&, &H4000&, &H8000&, _
&H10000, &H20000, &H40000, &H80000, _
&H100000, &H200000, &H400000, &H800000, _
&H1000000, &H2000000, &H4000000, &H8000000, _
&H10000000, &H20000000, &H40000000, &H80000000, _
&H0&)
'2^i-1
g_aryMask = Array( _
&H0&, &H1&, &H3&, &H7&, _
&HF&, &H1F&, &H3F&, &H7F&, _
&HFF&, &H1FF&, &H3FF&, &H7FF&, _
&HFFF&, &H1FFF&, &H3FFF&, &H7FFF&, _
&HFFFF&, &H1FFFF, &H3FFFF, &H7FFFF, _
&HFFFFF, &H1FFFFF, &H3FFFFF, &H7FFFFF, _
&HFFFFFF, &H1FFFFFF, &H3FFFFFF, &H7FFFFFF, _
&HFFFFFFF, &H1FFFFFFF, &H3FFFFFFF, &H7FFFFFFF, _
&HFFFFFFFF)
'2^8-2^i+1
g_aryRevMask = Array( _
&HFFFFFFFF, &HFFFFFFFE, &HFFFFFFFC, &HFFFFFFF8, _
&HFFFFFFF0, &HFFFFFFE0, &HFFFFFFC0, &HFFFFFF80, _
&HFFFFFF00, &HFFFFFE00, &HFFFFFC00, &HFFFFF800, _
&HFFFFF000, &HFFFFE000, &HFFFFC000, &HFFFF8000, _
&HFFFF0000, &HFFFE0000, &HFFFC0000, &HFFF80000, _
&HFFF00000, &HFFE00000, &HFFC00000, &HFF800000, _
&HFF000000, &HFE000000, &HFC000000, &HF8000000, _
&HF0000000, &HE0000000, &HC0000000, &H80000000, _
&H0&)
'-----------------------------------------------------------
call test(-128)
WScript.Quit
'テスト / test
'使い方 / usage
Sub test(val)
Dim i
Dim j
Dim l
Dim r
For i = 1 to 4
For j = 1 to 32
If j mod 16 = 1 Then r = "test : " & val & " (" & Dec2Bin32(val) & ")"
Select Case i
Case 1
l = LogicalBitShiftToLeft(val, j)
r = r & vbLf & right(" " & j, 2) & " <<< " & Dec2Bin32(l) & _
" (" & l & ")"
Case 2
l = LogicalBitShiftToRight(val, j)
r = r & vbLf & right(" " & j, 2) & " >>> " & Dec2Bin32(l) & _
" (" & l & ")"
Case 3
l = ArithmeticBitShiftToLeft(val, j)
r = r & vbLf & right(" " & j, 2) & " << " & Dec2Bin32(l) & _
" (" & l & ")"
Case 4
l = ArithmeticBitShiftToRight(val, j)
r = r & vbLf & right(" " & j, 2) & " >> " & Dec2Bin32(l) & _
" (" & l & ")"
End Select
If j mod 16 = 0 Then Msgbox r
Next
Next
End Sub
'-----------------------------------------------------------
'左論理ビットシフト / logical bit shift to left
' val: long value
' shiftnum: number of bit
' return: long value
Function LogicalBitShiftToLeft(val, shiftnum)
Dim lng
lng = Clng(val)
If shiftnum > 0 And shiftnum < 32 Then
LogicalBitShiftToLeft = (lng And g_aryMask(31 - shiftnum)) * _
g_aryPower(shiftnum)
If lng And g_aryPower(31 - shiftnum) Then _
LogicalBitShiftToLeft = LogicalBitShiftToLeft Or &H80000000&
ElseIf shiftnum <= 0 Then
LogicalBitShiftToLeft = lng
ElseIf shiftnum >= 32 Then
LogicalBitShiftToLeft = &H0&
End If
End Function
'左算術ビットシフト / arithmetic bit shift to left
' val: long value
' shiftnum: number of bit
' return: long value
Function ArithmeticBitShiftToLeft(val, shiftnum)
Dim lng
lng = Clng(val)
If shiftnum > 0 And shiftnum < 31 Then
If lng And &H80000000& Then
lng = lng Or g_aryRevMask(31 - shiftnum)
Else
lng = lng And g_aryMask(31 - shiftnum)
End If
ArithmeticBitShiftToLeft = lng * g_aryPower(shiftnum)
ElseIf shiftnum <= 0 Then
ArithmeticBitShiftToLeft = lng
ElseIf shiftnum >= 31 Then
If lng And &H80000000& Then
ArithmeticBitShiftToLeft = &H80000000&
Else
ArithmeticBitShiftToLeft = &H0&
End If
End If
End Function
'右論理ビットシフト / logical bit shift to right
' val: long value
' shiftnum: number of bit
' return: long value
Function LogicalBitShiftToRight(val, shiftnum)
Dim lng
lng = Clng(val)
If shiftnum > 0 And shiftnum < 32 Then
LogicalBitShiftToRight = (lng And g_aryRevMask(shiftnum)) \ _
g_aryPower(shiftnum) And g_aryMask(32 - shiftnum)
ElseIf shiftnum <= 0 Then
LogicalBitShiftToRight = lng
ElseIf shiftnum >= 32 Then
LogicalBitShiftToRight = &H0&
End If
End Function
'右算術ビットシフト / arithmetic bit shift to right
' val: long value
' shiftnum: number of bit
' return: long value
Function ArithmeticBitShiftToRight(val, shiftnum)
Dim lng
lng = Clng(val)
If shiftnum > 0 And shiftnum < 31 Then
ArithmeticBitShiftToRight = (lng And g_aryRevMask(shiftnum)) \ _
g_aryPower(shiftnum)
ElseIf shiftnum <= 0 Then
ArithmeticBitShiftToRight = lng
ElseIf shiftnum >= 31 Then
If lng And &H80000000& Then
ArithmeticBitShiftToRight = &HFFFFFFFF&
Else
ArithmeticBitShiftToRight = &H0&
End If
End If
End Function
'Longを2進数の文字列に変換 / convert long value to digit string
' val: long value
' return: string
Function Dec2Bin32(val)
Dim i
Dim lng
lng = Clng(val)
For i = 0 To 31
If g_aryPower(31 - i) And lng Then
Dec2Bin32 = Dec2Bin32 & "1"
Else
Dec2Bin32 = Dec2Bin32 & "0"
End If
Next
End Function
