IEnumerable
sẽ không hoạt động. Tối ưu hóa của một số ví dụ trong chủ đề này:
một đầu tiên (nhanh nhất - 2,35 giây cho 10M chạy, phạm vi 1..10M):
static uint[] MulDeBruijnBitPos = new uint[32]
{
0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
static uint[] GetExponents(uint value)
{
uint[] data = new uint[32];
int enabledBitCounter = 0;
while (value != 0)
{
uint m = (value & (0 - value));
value ^= m;
data[enabledBitCounter++] = MulDeBruijnBitPos[(m * (uint)0x077CB531U) >> 27];
}
Array.Resize<uint>(ref data, enabledBitCounter);
return data;
}
phiên bản khác (nhanh thứ hai - 3 giây cho 10M chạy, phạm vi 1..10M):
static uint[] GetExponents(uint value)
{
uint[] data = new uint[32];
int enabledBitCounter = 0;
for (uint i = 0; value > 0; ++i)
{
if ((value & 1) == 1)
data[enabledBitCounter++] = i;
value >>= 1;
}
Array.Resize<uint>(ref data, enabledBitCounter);
return data;
}
Theo kinh nghiệm của riêng tôi Math.pow là rất rất chậm. Thậm chí còn chậm hơn nhiều so với Math.Cos hoặc Math.Sqrt. Nó không có cơ hội để làm tốt hơn thay đổi số nguyên, bao giờ hết. –