あんみんどうふです。
C#でビット演算を扱うプログラム作成時に行き詰まったのでメモ。
int型の変数で符号なし右シフト(>>>)を行おうとしたものの、C#のバージョンが足りませんでした。
符号なし右シフトは「C# 11.0」から対応しているそうですが、.NET Core 3.1を用いて開発していたためバージョンは「C# 8.0」で固定されており使えません。
かと言って、符号が付いた負の値をそのままシフトしようにもうまくできません。さてどうしたものか。
結論
“uint”を使えば解決できる単純な話でした。
int型の範囲は-2147483647~2147483647、uint型は0~4294967295。
最初から符号がないuint型を使えば普通のシフトも実質符号なしのシフトになります。
1 2 3 4 5 6 | int minus = -1; int signed = minus >> 8; uint unsigned = (uint)minus >> 8; Console.WriteLine(signed); // -1 (0xFFFFFFFF) Console.WriteLine(unsigned); // 16777215 (0x00FFFFFF) |
シフト後intに戻してあげればint型で使えます。
1 2 3 | int cast = (int)unsigned; Console.WriteLine(cast); // 16777215 |
以上。