[英]How can optimize this boolean function for speed?
我有 2 個無符號 8 位整數 a,b。
計算結果為 -1 或 1。
我使用整數 a,b 的二進制表示
a=173;
b=154;
bina = "10101101"
binb = "10011010"
首先,消除了兩個整數a XOR b
上的公共位:
aANb = a & (a ^ b)
bANa = b & (a ^ b)
aANb = 00100101
bANa = 00010010
對於 bANa 中的每個 1 位,計算該位aANb
bANa
的 1 位的數量。
然后計算bANa
中每個比特的比特數之和。
例如, bANa
中有 2 個 1 位。 在aANb
中,最左邊的位在其右側有 2 個 1 位:
bANa = 0001 0001
aANb = 0010 0101 -> 2 bits
aANb
中的第二個 1 位在bANa
的右側有 1 個 1 位:
bANa = 0001001 0
aANb = 0010010 1 -> 1 bit
然后找到這些值的總和:
sum = 2+1 = 3
如果 sum 為偶數,則返回 1,如果為奇數,則返回 -1
我的目標是 x86,但我希望它是開源的,所以我不知道它將在哪個 CPU 中運行。
我希望它可以加快。 請注意,如果 aANb 有成對的連續 1,它們不會改變結果。
也許比特串可以分解成更小的塊,並帶有表格的結果。
這是我的代碼(這是我的第一個 C# 代碼,我以前從未寫過 C#)
int a = 173;
int b = 154;
int sum = 0;
int aANb = 0;
int bANa = 0;
for (int i = 0; i < 8; i++)
{
aANb = a & (a ^ b);
bANa = b & (a ^ b);
if ((bANa >> i) % 2 == 1)
{
for (int j = i; j < 8; j++)
{
sum += (aANb >> j) % 2;
}
}
}
int[] answer = { 1, -1 };
string result = $"a={a}\n" +
$"b={b}\n" +
$"binary a={Convert.ToString(a, 2).PadLeft(8, '0')}\n" +
$"binary b={Convert.ToString(b, 2).PadLeft(8, '0')}\n" +
$" aANb={Convert.ToString(aANb,2).PadLeft(8, '0')}\n" +
$" bANa={Convert.ToString(bANa,2).PadLeft(8, '0')}\n" +
$"sum={sum}\n" +
$"result={answer[sum % 2]}";
System.Console.WriteLine(result);
這應該輸出
a = 173
b = 154
binary a=10101101
binary b=10011010
aANb=00100101
bANa=00010010
sum=3
result=-1
>>>result=-1
首先:aANb 和 bANa 只需要在循環外計算一次。
第二:您不必計算總和,因為向總和添加奇數會反轉“奇數”狀態,您只能使用 XOR 操作:
int a = 173;
int b = 154;
int odd = 0;
int aANb = a & ~b;
int bANa = b & ~a;
for (int i = 0; i < 8; i++)
{
if ((bANa >> i) % 2 == 1)
{
for (int j = i; j < 8; j++)
{
odd ^= (bANa >> j) ;
}
}
}
結果:
$"result={answer[odd%2]}";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.