假設我有一個32或64位無符號整數。位技巧找到0的數量等於1的數量的第一個位置
找到最左邊位的索引i的最快方法是什麼,使得最左邊的i位中的0的數量等於最左邊的i位中的1的數量? 我在想一些像here提到的一些技巧。
我對最近的x86_64處理器感興趣。這可能與某些處理器支持指令如POPCNT(計數1的數量)或LZCNT(計數前導0的數量)相關。
如果有幫助,可以假設第一位總是有一定的值。
實施例(有16位): 如果整數是
1110010100110110b
^
i
然後I = 10和它對應的標記的位置。
的可能(慢)實現16位整數可能是:
mask = 1000000000000000b
pos = 0
count=0
do {
if(x & mask)
count++;
else
count--;
pos++;
x<<=1;
} while(count)
return pos;
編輯:在代碼中的bug固定按@njuffa評論。
而'i = 0'會被禁止,對不對?否則,它有點無聊 – harold
是的確的:)我必須在範圍1,...,大小其中大小是整數的位數。 – Steven
我不清楚規格。你能提供一個簡單的(慢)參考實現嗎?在我看來,這樣一個最左邊的位的位置不能總是被找到,一個簡單的32位示例是0xFFFFFFFE(或者結果是在這種情況下是32) – njuffa