![](/img/trans.png)
[英]Reverse tetrads (nybbles) to get a mirrored hex using bit manipulations only
[英]Optimizing a check using bit manipulations
我將以下代碼片段作為一種算法的一部分。 我使用pi_
, pi
, pi_stack[i]
, is
和is_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)
成立。 目前,我正在迭代所有可能的子集。 應該是什么之間的關系is
, pi_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]
。 我們有兩個問題:是否可以同時滿足兩個條件? 而且,如果是這樣,那么兩者的組合是哪一個標准?
如果m
和RequiredBits
沒有任何共同的設置位,則不會發生沖突,因為pi_
可以在它們各自控制的任何位位置自由獲得所需的值。 如果它們確實具有共同的設置位,則v
和RequiredValue
在這些位中必須相同,因為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
是零,這是不可能的,因為那時沒有位置的is
那pi_
和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.