RotateLeftメソッド・RotateRightメソッドは、回転シフト(循環シフト、circular shift)を行います。 x86 ROL/ROR命令に類似する演算を行います。
RotateLeft・RotateRightメソッドは、uint
/UInteger
, ulong
/ULong
の整数型のみに対して定義されています。 シフト量(引数offset)は、値の型のビット数(32または64)を超える数を指定できるほか、負数を指定することもできます。 シフト量が負の場合は、逆方向への回転シフトになります。
BitOperations.RotateLeft/RotateRightメソッドで左回転シフト・右回転シフトを行う .NET Core 3.0
Imports System
Imports System.Numerics
Module Sample
Sub Main()
' BitOperations.RotateLeft/RotateRightメソッドはUInteger/ULongに対してのみ使用できる
Dim val As UInteger = &B_1000_0000_0000_0000_0000_0000_0000_0001UI
' BitOperations.RotateLeftで値に対して左回転シフトを行う
Dim val_rol1 As UInteger = BitOperations.RotateLeft(val, 1)
' BitOperations.RotateRightで値に対して右回転シフトを行う
Dim val_ror1 As UInteger = BitOperations.RotateRight(val, 1)
Console.WriteLine($"RotateLeft({val.ToBinary()}, -1) = {BitOperations.RotateLeft(val, -1).ToBinary()}")
Console.WriteLine($"RotateLeft({val.ToBinary()}, 0) = {BitOperations.RotateLeft(val, 0).ToBinary()}")
Console.WriteLine($"RotateLeft({val.ToBinary()}, 1) = {BitOperations.RotateLeft(val, 1).ToBinary()}")
Console.WriteLine($"RotateLeft({val.ToBinary()}, 2) = {BitOperations.RotateLeft(val, 2).ToBinary()}")
Console.WriteLine($"RotateLeft({val.ToBinary()}, 31) = {BitOperations.RotateLeft(val, 31).ToBinary()}")
Console.WriteLine($"RotateLeft({val.ToBinary()}, 32) = {BitOperations.RotateLeft(val, 32).ToBinary()}")
Console.WriteLine($"RotateLeft({val.ToBinary()}, 33) = {BitOperations.RotateLeft(val, 33).ToBinary()}")
Console.WriteLine()
Console.WriteLine($"RotateRight({val.ToBinary()}, -1) = {BitOperations.RotateRight(val, -1).ToBinary()}")
Console.WriteLine($"RotateRight({val.ToBinary()}, 0) = {BitOperations.RotateRight(val, 0).ToBinary()}")
Console.WriteLine($"RotateRight({val.ToBinary()}, 1) = {BitOperations.RotateRight(val, 1).ToBinary()}")
Console.WriteLine($"RotateRight({val.ToBinary()}, 2) = {BitOperations.RotateRight(val, 2).ToBinary()}")
Console.WriteLine($"RotateRight({val.ToBinary()}, 31) = {BitOperations.RotateRight(val, 31).ToBinary()}")
Console.WriteLine($"RotateRight({val.ToBinary()}, 32) = {BitOperations.RotateRight(val, 32).ToBinary()}")
Console.WriteLine($"RotateRight({val.ToBinary()}, 33) = {BitOperations.RotateRight(val, 33).ToBinary()}")
Console.WriteLine()
End Sub
#Region "数値を二進数表記で文字列化するためのメソッド"
<System.Runtime.CompilerServices.Extension> _
Function ToBinary(ByVal number As UInteger) As String
Return "&B_" + Convert.ToString(number, 2).PadLeft(8 * Len(number), "0"c)
End Function
#End Region
End Module
実行結果
RotateLeft(&B_10000000000000000000000000000001, -1) = &B_11000000000000000000000000000000 RotateLeft(&B_10000000000000000000000000000001, 0) = &B_10000000000000000000000000000001 RotateLeft(&B_10000000000000000000000000000001, 1) = &B_00000000000000000000000000000011 RotateLeft(&B_10000000000000000000000000000001, 2) = &B_00000000000000000000000000000110 RotateLeft(&B_10000000000000000000000000000001, 31) = &B_11000000000000000000000000000000 RotateLeft(&B_10000000000000000000000000000001, 32) = &B_10000000000000000000000000000001 RotateLeft(&B_10000000000000000000000000000001, 33) = &B_00000000000000000000000000000011 RotateRight(&B_10000000000000000000000000000001, -1) = &B_00000000000000000000000000000011 RotateRight(&B_10000000000000000000000000000001, 0) = &B_10000000000000000000000000000001 RotateRight(&B_10000000000000000000000000000001, 1) = &B_11000000000000000000000000000000 RotateRight(&B_10000000000000000000000000000001, 2) = &B_01100000000000000000000000000000 RotateRight(&B_10000000000000000000000000000001, 31) = &B_00000000000000000000000000000011 RotateRight(&B_10000000000000000000000000000001, 32) = &B_10000000000000000000000000000001 RotateRight(&B_10000000000000000000000000000001, 33) = &B_11000000000000000000000000000000