거기에는 많은 계산 방법이 있지만 내 경우에는 임의로 큰 숫자에 최대 두 세트의 비트가 포함되어 있는지 테스트해야합니다.C에서 임의로 큰 양의 정수를 계산하는 비트 #
저는 작업을 수행하는 매우 빠른 것으로 보이는 다음 함수를 작성했지만 C#으로 더욱 최적화 될 수 있는지 알아보고 싶었습니다. 이 함수는 몇 백만 번 루프에서 호출됩니다. 중요
public static byte [] BitCountLookupArray = new byte []
{
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
};
// The parameter [number] will NEVER be negative.
public static bool HasSetBitCountOfLessThenThree (System.Numerics.BigInteger number)
{
int sum = 0;
byte [] bytes = null;
bytes = number.ToByteArray();
for (int i=0; i < bytes.Length; i++)
{
sum += BitCountLookupArray [bytes [i]];
}
return (sum < 3);
}
: 인자 [번호] 함수는 전송 NEVER는 제외 할 것이다. 내가 생각
어떤 점이었다 :
- 함수가 정적 만들기. 끝난.
- 정적 조회 배열 사용. 끝난.
- 바이트 수는 종종 100,000을 넘기 때문에 배열 색인 대신 포인터를 사용합니다. 이것이 얼마나 도움이 될지 확신하지 못합니다.
- .NET에서 슬프게도 보장 할 수없는 인라인 함수를 강제 적용합니다.
다른 제안 사항이 있습니다. 당신이 최적화 할 수 있습니다
사과를 나는 이해하지 확신합니다. 당신은 비트 카운트라고하지만 바이트를 사용하고 있습니까? –
@SimonWhitehead : 우리는 비트를 세고 있습니다. 그들은 단지 바이트 배열로 사용할 수 있습니다. –