Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Mary-Kate Olsenasal
2024-11-19 06:33:02536semak imbas

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;
}

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