Ho una macchina che supporta solo operazioni a 32 bit, lunga non funziona su questa macchina. Ho una quantità a 64 bit rappresentata da due 32 int senza segno. La domanda è come posso eseguire un mod su quella quantità a 64 bit con un divisore a 32 bit.Come posso implementare un'operazione modulo su unsigned con hardware limitato in C
r = a mod b
dove:
a è il valore e B a 64 bit è valore a 32 bit
pensavo che avrei potuto rappresentare la parte mod facendo: a = a1 * (2^32) + a2 (dove a1 è il bit superiore e a2 è il bit inferiore)
(a1 * (2^32) + a2) mod b = ((a1 * 2^32) mod b + a2 mod b) mod b
((a1 * 2^32) mod b + a2 mod b) mod b = (a1 mod b * 2^32 mod b + a2 mod b) mod b
ma il problema è che 2^32 mod b può talvolta essere uguale a 2^32 e quindi la moltiplicazione traboccherà. Ho cercato di convertire la moltiplicazione in un'aggiunta, ma ciò richiede anche che io usi 2^32 che se mod mi darà ancora 2^32 :) quindi non sono sicuro di come eseguire una mod unsigned di 64 bit valore con uno a 32 bit.
immagino una semplice soluzione a questo sarebbe quella di eseguire le seguenti operazioni:
a/b = c
a = a - piano (c) * b
eseguire 1 finché c è uguale a 0 e utilizzare a come risposta.
ma non sono sicuro come combinare questi due interi insieme per formare il valore di 64 bit
Giusto per essere completo qui sono alcuni link per divisione binaria e sottrazioni: http://www.exploringbinary.com/binary-division/
e una descrizione dell'algoritmo della divisione binaria: http://en.wikipedia.org/wiki/Division_algorithm
Il compilatore C per il tuo hardware non lo supporta già? Per esempio. 'uint64_t a, b, r; r = a% b; ' –
" 2^32 mod b può talvolta essere uguale a 2^32 ". Suggerire no 'b <= (2^32 - 1)', quindi '(2^32 mod b) <(2^32)'. – chux
Hai capito cosa c'è da guadagnare considerando 'a' come un numero rappresentato in un sistema numerico posizionale usando la base 2³², e quale problema rimane - non male male. Ora, per quanto riguarda la base 2¹⁶? 2¹⁶ ± 1? (E che dire del cinese?) – greybeard