Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengekstrak Bit Tertib Tinggi bagi Pendaraban Integer 64-Bit dalam C?

Bagaimana untuk Mengekstrak Bit Tertib Tinggi bagi Pendaraban Integer 64-Bit dalam C?

Mary-Kate Olsen
Lepaskan: 2024-11-19 06:33:02
asal
619 orang telah melayarinya

How to Extract the High-Order Bits of a 64-Bit Integer Multiplication in C  ?

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

  1. 128- Darab Bit:

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.

  1. Pendaraban 32-Bit dan Pengumpulan 64-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;
}
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan