LeadingZeroCountメソッド・TrailingZeroCountメソッドは、1のビットに先行/後続する0のビットの数(最上位/最下位ビットから見て0の桁が連続する数)を計上します。 x86 LZCNT/TZCNT命令に類似する演算を行います。
LeadingZeroCount・TrailingZeroCountメソッドは、uint
/UInteger
, ulong
/ULong
の整数型のみに対して定義されています。 なお、結果はint
/Integer
で返されます。
BitOperations.LeadingZeroCount/TrailingZeroCountメソッドで先行/後続する0のビットの数を計上する .NET Core 3.0
using System;
using System.Numerics;
static class Sample {
static void Main()
{
// BitOperations.LeadingZeroCount/TrailingZeroCountメソッドはuint/ulongに対してのみ使用できる
uint val = 0b_0000_0000_0000_0001_1000_0000_0000_0000;
// BitOperations.LeadingZeroCountで最上位ビットから連続する0のビットの数を求める
int lzcnt = BitOperations.LeadingZeroCount(val);
// BitOperations.TrailingZeroCountで最下位ビットより連続する0のビットの数を求める
int tzcnt = BitOperations.TrailingZeroCount(val);
foreach (var amount in new[] {0, 1, 2, 29, 30, 31}) {
val = 0b_1u << amount;
lzcnt = BitOperations.LeadingZeroCount(val);
Console.WriteLine($"LeadingZeroCount({val.ToBinary()}) = {lzcnt}");
}
Console.WriteLine();
foreach (var amount in new[] {0, 1, 2, 29, 30, 31}) {
val = 0b_1u << (31 - amount);
tzcnt = BitOperations.TrailingZeroCount(val);
Console.WriteLine($"TrailingZeroCount({val.ToBinary()}) = {tzcnt}");
}
Console.WriteLine();
}
#region "数値を二進数表記で文字列化するためのメソッド"
static string ToBinary(this uint number) => "0b_" + Convert.ToString(number, 2).PadLeft(8 * sizeof(uint), '0');
#endregion
}
実行結果
LeadingZeroCount(0b_00000000000000000000000000000001) = 31 LeadingZeroCount(0b_00000000000000000000000000000010) = 30 LeadingZeroCount(0b_00000000000000000000000000000100) = 29 LeadingZeroCount(0b_00100000000000000000000000000000) = 2 LeadingZeroCount(0b_01000000000000000000000000000000) = 1 LeadingZeroCount(0b_10000000000000000000000000000000) = 0 TrailingZeroCount(0b_10000000000000000000000000000000) = 31 TrailingZeroCount(0b_01000000000000000000000000000000) = 30 TrailingZeroCount(0b_00100000000000000000000000000000) = 29 TrailingZeroCount(0b_00000000000000000000000000000100) = 2 TrailingZeroCount(0b_00000000000000000000000000000010) = 1 TrailingZeroCount(0b_00000000000000000000000000000001) = 0