Bagaimanakah anda boleh mendapatkan bahagian tinggi pendaraban integer 64-bit dalam C ?

Linda Hamilton
Lepaskan: 2024-11-12 13:09:02
asal
753 orang telah melayarinya

How can you obtain the high part of a 64-bit integer multiplication in C  ?

Mendapatkan Bahagian Tinggi Pendaraban Integer 64-Bit

Dalam C , jika i dan j ialah integer tidak bertanda 64-bit, i * j menghasilkan 64 bit yang lebih rendah daripada produk mereka, iaitu, (i * j) mod 2^64. Untuk mendapatkan bahagian produk yang lebih tinggi, pertimbangkan pendekatan berikut:

Menggunakan 128-Bit Multiply:

Jika pengkompil menyokong integer 128-bit (cth., __uint128_t ), melakukan darab 128-bit dan mengekstrak 64 bit atas ialah kaedah yang paling cekap.

Pendekatan YAK (Menggunakan Darab 32-Bit):

Ini melibatkan memecahkan setiap integer 64-bit kepada dua bahagian 32-bit, mendarabnya menggunakan operasi darab 64-bit dan menggabungkan keputusan:

uint64_t a_lo = uint32_t(a);
uint64_t a_hi = a >> 32;
uint64_t b_lo = uint32_t(b);
uint64_t b_hi = b >> 32;

uint64_t multhi = a_hi * b_hi + (a_hi * b_lo >> 32) + (b_hi * a_lo >> 32) + a_lo * b_lo;
Salin selepas log masuk

Mengendalikan Limpahan:

Walau bagaimanapun, pengiraan di atas melaksanakan aritmetik 128-bit, yang boleh mengakibatkan limpahan. Untuk mengendalikan ini apabila dihadkan kepada aritmetik 64-bit, pelaksanaan berikut dilaraskan untuk limpahan:

uint64_t a_x_b_hi = a_hi * b_hi;
uint64_t a_x_b_mid = a_hi * b_lo;
uint64_t b_x_a_mid = b_hi * a_lo;
uint64_t a_x_b_lo = a_lo * b_lo;

uint64_t carry_bit = ((uint32_t)a_x_b_mid + (uint32_t)b_x_a_mid + (a_x_b_lo >> 32)) >> 32;

uint64_t multhi = a_x_b_hi + (a_x_b_mid >> 32) + (b_x_a_mid >> 32) + carry_bit;
Salin selepas log masuk

Nota: Jika ralat 1 bit dalam 64 bit atas boleh diterima, pengiraan bit pembawa boleh ditinggalkan.

Atas ialah kandungan terperinci Bagaimanakah anda boleh mendapatkan bahagian tinggi pendaraban integer 64-bit dalam C ?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan