簡體   English   中英

如何重置位掩碼的第 N 個設置位?

[英]How to reset the Nth set bit of a bit mask?

給定一個位掩碼(設置了 M 位,即 popcount(bit_mask) == M),我想生成 M 個不同的位掩碼,這些位掩碼有 1 個設置位(給定的位掩碼)切換。

上述問題歸結為當前標題“如何重置位掩碼的第 N 個設置位”

對於位掩碼 0xE7 (popcount(0xE7) == 6),將生成以下 6 位掩碼

0xE6 (the 1st set bit is toggled)
0xE5 (the 2nd set bit is toggled)
0xE3 (the 3rd set bit is toggled)
0xC7 (the 4th set bit is toggled)
0xA7 (the 5th set bit is toggled)
0x67 (the 6th set bit is toggled)

我當前的代碼使用(英特爾處理器的)並行位存儲指令,但它不可移植(我認為)。

_pdep_u32(~0x1U, 0xE7U) == 0xE6U
_pdep_u32(~0x2U, 0xE7U) == 0xE5U
_pdep_u32(~0x4U, 0xE7U) == 0xE3U
_pdep_u32(~0x8U, 0xE7U) == 0xC7U
_pdep_u32(~0x10U, 0xE7U) == 0xA7U
_pdep_u32(~0x20U, 0xE7U) == 0x67U

由於您需要生成整個掩碼序列,因此您可以按順序枚舉 1 位,而不是提供隨機訪問。

使用標准位操作很容易做到這一點。

枚舉 1 位:

for (mask_bit = mask&-mask; mask_bit; mask_bit = mask&~(mask-(mask_bit<<1))) {

    // mask_bit is the next 1 bit in mask
    // next output mask is then mask &~ mask_bit
}

暫無
暫無

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

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