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