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:
-
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.
-
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.
-
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.
-
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!