簡體   English   中英

如何優化這個布爾函數的速度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM