首頁 > 後端開發 > C++ > 如何有效計算位元集中某個位置或更低位置的設定位?

如何有效計算位元集中某個位置或更低位置的設定位?

DDD
發布: 2024-12-04 03:10:10
原創
708 人瀏覽過

How to Efficiently Count Set Bits at a Position or Lower in a Bitset?

高效率計算某個位置或更低位置的設定位

問題陳述:

問題陳述:

問題陳述:

#include <bitset>

int popcount_subset(std::bitset<64> bits, int pos) {
    int high_bits_to_eliminate = 63 - pos;
    bits <<= high_bits_to_eliminate & 63; // Shift to place desired bits at the top
    return (bits[63] ? ~0ULL : 0) & bits.count(); // Broadcast high bit or return 0, then popcount
}
登入後複製
給定std::bitset使用任意位元值和位元位置X (0-63),確定對位置 X或更低的位元進行計數的最有效方法,或者如果未設定 X 處的位,則傳回 0。

最佳化解決方案:

  1. 以下 C 程式碼產生高度最佳化的 x86 ASM,可有效計算指定範圍內的設定位範圍:
  2. 實作細節:
  3. 移位操作:位元集左移63 - pos 以對齊64 位元暫存器頂部的所需位元。這可以從計數中消除不需要的位元。
  4. 位元廣播:使用算術右移將移位後的位元集的高位廣播到所有位元位置。這將建立一個掩碼,其中如果設定了高位(即設定了 pos 處的位元),則所有位元都被設置,否則所有位元都被清除。

條件 Popcount: AND 運算將位集與遮罩結合。如果 pos 處的位元被設置,則遮罩將為 ~0ULL,從而產生原始的 popcount。否則,遮罩將為 0,導致 popcount 為 0。

    最佳ASM:
  • 此程式碼利用硬體popcount 指令和位元廣播,在64 位元架構上產生高效率的x86 ASM
  • 優點:
可有效計算指定範圍內的設定位。 適用於任意位集大小相應地調整常數。 在許多架構上產生高度最佳化的 ASM,包括x86-64 和 ARM64。 處理 pos 超出位元集大小的情況,而不會出現未定義的行為。

以上是如何有效計算位元集中某個位置或更低位置的設定位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板