簡體   English   中英

使用位操作優化檢查

[英]Optimizing a check using bit manipulations

我將以下代碼片段作為一種算法的一部分。 我使用pi_pipi_stack[i]isis_stack[i] (全部為unsigned int )作為大小為N的集合的子集。

  • N_MASK=(1<<N)-1是確定unsigned int哪一部分有用的掩碼。
  • N_POLICY=(1<<N)

我想查找是否存在子集pi_這樣的((pi_^pi) & (is^N_MASK)) == 0 && ((pi_^pi_stack[i]) & is_stack[i]) == 0 && ((pi_^pi) & is)成立。 目前,我正在迭代所有可能的子集。 應該是什么之間的關系ispi_stack[i] is_stack[i]pi等等,沒有這樣的pi_存在?

bool flag=false;
for(uint pi_=0; pi_<N_POLICY && !flag; pi_++){
    flag = flag || (
        ((pi_^pi) & (is^N_MASK)) == 0 &&
        ((pi_^pi_stack[i]) & is_stack[i]) == 0 &&
        ((pi_^pi) & is)
    );
}

我想出了: flag = (((is_stack[i] & (is^N_MASK)) & (pi_stack[i]^pi))) || 0 == (is_stack[i] & (pi^pi_stack[i])) ; flag = (((is_stack[i] & (is^N_MASK)) & (pi_stack[i]^pi))) || 0 == (is_stack[i] & (pi^pi_stack[i])) ; 但這是行不通的,但是可以讓我對所要查找的內容有所了解。 此代碼旨在替換上面的循環。

除了遍歷pi_stack[i]is_stack[i]之外,無需循環即可直接計算解決方案。

形式(pi_ ^ v) & m要求pi_v在每個以m為單位設置的位位置具有相同的值。 我們可以這樣表示:

uint RequiredBits   = m; // Mask of bits that must have certain values.
uint RequiredValues = v & m; // Record of the values the bits must have.

您的測試顯示了兩個這樣的標准:

((pi_ ^ pi) & (is ^ N_MASK)) == 0

((pi_ ^ pi_stack[i]) & is_stack[i]) == 0

假設我們已經代表了第一個標准:

uint RequiredBits   = is ^ N_MASK;
uint RequiredValues = pi & RequiredBits;

現在,我們還需要第二個條件。 為簡便起見,讓我們分配v = pi_stack[i]m = is_stack[i] 我們有兩個問題:是否可以同時滿足兩個條件? 而且,如果是這樣,那么兩者的組合是哪一個標准?

如果mRequiredBits沒有任何共同的設置位,則不會發生沖突,因為pi_可以在它們各自控制的任何位位置自由獲得所需的值。 如果它們確實具有共同的設置位,則vRequiredValue在這些位中必須相同,因為pi_不能在同一位置同時包含0和1。 因此,沖突測試是:

if (((v ^ RequiredValues) & (m & RequiredBits)) != 0)
    print/exit/return/whatever; // Report no solution is possible.

如果兩個條件一致,那么我們可以將它們結合起來:

RequiredValues = RequiredValues | (v & m);
RequiredBits   = RequiredBits | m;

如果有涉及的標准多個實例pi_stack[i]is_stack[i]為的不同值i ,則以上可以重復。

最后,我們有判據pi_ ^ pi) & is 這就是說pi_一個pi必須在該位置中的至少一個位的位置不同is 這個位置必須是未在設定的位置RequiredBits ,因為早期的標准要求pi_pi在那些位置相同,這是不可能的pi_pi既相同,並在相同的位置不同。

因此, pi_pi必須至少相差is & ~RequiredBits 如果is & ~RequiredBits是零,這是不可能的,因為那時沒有位置的ispi_pi被允許不同的所以我們測試:

if ((is & ~RequiredBits) == 0)
    print/exit/return/whatever; // Report no solution is possible.

否則,我們構造之間的一些差異pi_pi的要求(通過is )和可用(由~RequiredBits )位置:

uint Differences = ~pi & (is & ~RequiredBits);

那么一個解決方案是:

uint pi_ = RequiredValues | Differences;

可以通過以下方式迭代所有可能的解決方案:

  • 迭代pi_所有位,而不是is | RequiredBits 所有可能值的is | RequiredBits
  • 通過pi & (is & ~RequiredBits)以外的所有可能值來迭代pi_is & ~RequiredBits pi_所有位(因為這是其中is & ~RequiredBits 〜RequiredBits指定的所有位都具有它們在pi所做的值的值,但我們希望至少有一個不同)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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