Mengambil Bit Tertib Tinggi bagi Pendaraban Integer 64-Bit
Dalam C , mendarab dua integer tidak bertanda 64-bit (uint64_t) menghasilkan nilai yang mewakili bit tertib rendah pendaraban, dengan berkesan memberikan hasil modulo 2^64. Ini menimbulkan persoalan tentang cara mendapatkan bit tertib tinggi, yang selalunya diperlukan untuk pengiraan tertentu.
Pendekatan Pelaksanaan
Jika pengkompil anda menyokong nombor 128-bit (__uint128_t), melakukan pendaraban 128-bit dan mengekstrak 64 bit atas menyediakan cara paling berkesan untuk mendapatkan pesanan tinggi bit.
Jika nombor 128-bit tidak disokong, penyelesaian mudah alih dan mudah adalah untuk memecahkan setiap nombor 64-bit kepada dua nombor 32-bit, melakukan pendaraban 32-bit padanya dan mengumpul produk separa 64-bit dengan berhati-hati, dengan berhati-hati untuk mengelakkan limpahan integer.
Arahan Pemasangan:
Untuk sesetengah seni bina seperti x86, terdapat arahan pemasangan khusus (cth., MULH) direka bentuk untuk melaksanakan pendaraban integer 64-bit sedemikian. Walau bagaimanapun, menggunakan arahan ini dalam C memerlukan pengetahuan tentang pengaturcaraan pemasangan dan mungkin tidak mudah alih seperti pendekatan C yang dinyatakan sebelum ini.
Contoh Pelaksanaan:
Kod C berikut melaksanakan pendekatan pendaraban 32-bit dan pengumpulan 64-bit:
uint64_t mulhi(uint64_t a, uint64_t b) { uint32_t a_lo = (uint32_t)a; uint32_t a_hi = a >> 32; uint32_t b_lo = (uint32_t)b; uint32_t b_hi = b >> 32; uint64_t a_x_b_hi = a_hi * b_hi; uint64_t a_x_b_mid = a_hi * b_lo + a_lo * b_hi; // Avoid overflow uint64_t b_x_a_mid = b_hi * a_lo; uint64_t a_x_b_lo = a_lo * b_lo; uint64_t multhi = a_x_b_hi + (a_x_b_mid >> 32) + (b_x_a_mid >> 32) + (a_x_b_lo >> 64); return multhi; }
Atas ialah kandungan terperinci Bagaimana untuk Mengekstrak Bit Tertib Tinggi bagi Pendaraban Integer 64-Bit dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!