在C#中计算整数的log2的最快方法是什么?
如何最有效地计算C#中整数(对数为2)所需的位数?例如:
int bits = 1 + log2(100);=> bits == 7
回答:
(适用于.net core 3.0及更高版本…)
int val = BitOperations.Log2(x);
[StructLayout(LayoutKind.Explicit)] private struct ConverterStruct2
{
[FieldOffset(0)] public ulong asLong;
[FieldOffset(0)] public double asDouble;
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static int Log2(uint oval) //SunsetQuest4 version
{
ConverterStruct2 a; a.asLong = 0; a.asDouble = val;
return (int)((a.asLong >> 52) + 1) & 0xFF;
}
- 在SPWorley 3/22/2009中启发了在浮点中使用指数的想法。
- 这也支持超过32位。我没有测试最大,但确实至少达到了2 ^ 38。
- 在生产代码上请谨慎使用,因为这可能会在字节序不小的架构上失败。
这里是一些基准:(代码在这里:https :
//github.com/SunsetQuest/Fast-Integer-
Log2)
1-2^32 32-Bit Zero Function Time1 Time2 Time3 Time4 Errors Support Support
Log2_SunsetQuest3 18 18 79167 19 255 N N
Log2_SunsetQuest4 18 18 86976 19 0 Y N
LeadingZeroCount_Sunsetq - - - 30 0 Y Y
Log2_SPWorley 18 18 90976 32 4096 N Y
MostSigBit_spender 20 19 86083 89 0 Y Y
Log2_HarrySvensson 26 29 93592 34 0 Y Y
Log2_WiegleyJ 27 23 95347 38 0 Y N
Leading0Count_phuclv - - - 33 10M N N
Log2_SunsetQuest1 31 28 78385 39 0 Y Y
HighestBitUnrolled_Kaz 33 33 284112 35 2.5M N Y
Log2_Flynn1179 58 52 96381 48 0 Y Y
BitOperationsLog2Sunsetq - - - 49 0 Y Y
GetMsb_user3177100 58 53 100932 60 0 Y Y
Log2_Papayaved 125 60 119161 90 0 Y Y
FloorLog2_SN17 102 43 121708 97 0 Y Y
Log2_DanielSig 28 24 960357 102 2M N Y
FloorLog2_Matthew_Watson 29 25 94222 104 0 Y Y
Log2_SunsetQuest2 118 140 163483 184 0 Y Y
Msb_Protagonist 136 118 1631797 212 0 Y Y
Log2_SunsetQuest0 206 202 128695 212 0 Y Y
BitScanReverse2 228 240 1132340 215 2M N Y
Log2floor_greggo 89 101 2x10^7 263 0 Y Y
UsingStrings_Rob 2346 1494 2x10^7 2079 0 Y Y
Zero_Support = Supports Zero if the result is 0 or less
Full-32-Bit = Supports full 32-bit (some just support 31 bits)
Time1 = benchmark for sizes up to 32-bit (same number tried for each size)
Time2 = benchmark for sizes up to 16-bit (for measuring perf on small numbers)
Time3 = time to run entire 1-2^32 in sequence using Parallel.For. Most results range will on the larger end like 30/31 log2 results. (note: because random was not used some compiler optimization might have been applied so this result might not be accurate)
Time4 = .Net Core 3.1
AMD Ryzen CPU,Release模式,未调试器连接,.net core 3.1
我真的很喜欢花钱在另一个帖子中创建的那个。这没有潜在的体系结构问题,它还支持零,同时保持与SPWorley的float方法几乎相同的性能。
史蒂夫注意到 Log2_SunsetQuest3中缺少一些错误。
以上是 在C#中计算整数的log2的最快方法是什么? 的全部内容, 来源链接: utcz.com/qa/405860.html