1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <stdio.h>
#include <stdlib.h>
#define NBOCTETS 10
void DivBinOctet(unsigned char octet,int diviseur,unsigned char *tail,unsigned char *rest1,unsigned char *rest2,unsigned char *head);
/******************************************************************************/
/* Main : division binaire */
/******************************************************************************/
int main(void) {
int i, diviseur=1000;
unsigned char dividende[NBOCTETS]={0};
unsigned char head=0, rest1=0, rest2=0, tail=0;
// dividende est un tableau d'entiers compris entre 0 et 255
for (i=0;i<NBOCTETS;i++) {
dividende[i]=128;
}
// diviseur doit etre sur deux octets (et non nul !!)
if ( diviseur<1 || diviseur>65535 ) {
fprintf(stderr,"Erreur : valeur du diviseur incorrecte\n");
exit(EXIT_FAILURE);
}
for (i=0;i<NBOCTETS;i++) {
DivBinOctet(dividende[i],diviseur,&tail,&rest1,&rest2,&head);
}
printf("reste : %d\n",rest1 * 256 + rest2);
return 0;
}
/******************************************************************************/
/* Calcule de la division binaire pour un octet */
/******************************************************************************/
void DivBinOctet(unsigned char octet,int diviseur,unsigned char *tail,unsigned char *rest1,unsigned char *rest2,unsigned char *head) {
int nbbits=8, r, i;
unsigned char bit1, bit2;
*tail=octet;
do {
bit1 = (*tail & 128) >> 7;
*tail <<= 1;
bit2 = (*rest2 & 128) >> 7;
*rest2 <<= 1;
*rest2 ^= bit1;
bit1 = (*rest1 & 128) >> 7;
*rest1 <<= 1;
*rest1 ^= bit2;
*head <<= 1;
*head ^= bit1;
r = *rest1 * 256 + *rest2;
if ( r >= diviseur ) {
i = r - diviseur;
*rest1 = (unsigned char) (i / 256);
*rest2 = (unsigned char) (i - *rest1 * 256);
}
} while (--nbbits);
} |