Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengira Set Bit dengan Cekap pada Kedudukan atau Lebih Rendah dalam Bitset?

Bagaimana untuk Mengira Set Bit dengan Cekap pada Kedudukan atau Lebih Rendah dalam Bitset?

DDD
Lepaskan: 2024-12-04 03:10:10
asal
709 orang telah melayarinya

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

Mengira Set Bit dengan Cekap pada Kedudukan atau Rendah

Pernyataan Masalah:

Diberikan std::bitset<64> dengan nilai bit arbitrari dan kedudukan bit X (0-63), tentukan cara paling berkesan untuk mengira bit pada kedudukan X atau lebih rendah, atau kembalikan 0 jika bit pada X tidak ditetapkan.

Penyelesaian Dioptimumkan:

Kod C berikut menjana ASM x86 yang sangat dioptimumkan yang mengira bit set dengan cekap dalam tempoh tertentu julat:

#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
}
Salin selepas log masuk

Butiran Pelaksanaan:

  1. Operasi Shift: Bitset dianjak ke kiri sebanyak 63 - pos untuk menyelaraskan bit yang dikehendaki dengan bahagian atas daftar 64-bit. Ini menghapuskan bit yang tidak diingini daripada kiraan.
  2. Siaran Bit: Bit tinggi set bit yang dialih disiarkan ke semua kedudukan bit menggunakan anjakan kanan aritmetik. Ini mencipta topeng di mana semua bit ditetapkan jika bit tinggi ditetapkan (iaitu, bit di pos ditetapkan) dan semua bit jelas sebaliknya.
  3. Kaun Pop Bersyarat: Operasi DAN menggabungkan bitset dengan topeng. Jika bit di pos ditetapkan, topeng akan menjadi ~0ULL, menghasilkan kiraan pop asal. Jika tidak, topeng akan menjadi 0, menghasilkan kiraan pop 0.
  4. ASM Optimum: Kod ini menghasilkan ASM x86 yang cekap pada seni bina 64-bit, memanfaatkan arahan kiraan pop perkakasan dan siaran bit teknik.

Faedah:

  • Cekap untuk mengira bit set dalam julat tertentu.
  • Berfungsi untuk saiz bitset sewenang-wenangnya dengan melaraskan pemalar sewajarnya.
  • Menjana ASM yang sangat dioptimumkan pada banyak seni bina, termasuk x86-64 dan ARM64.
  • Mengendalikan kes di mana pos melebihi saiz set bit tanpa gelagat yang tidak ditentukan.

Atas ialah kandungan terperinci Bagaimana untuk Mengira Set Bit dengan Cekap pada Kedudukan atau Lebih Rendah dalam Bitset?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan