AngoLinux

Distanza di Hamming tra due codici ad 8 bit

- A cura del Prof. Stefano Salvi -


Cominciano gli esercizi sui codici a rilevazione e correzione di errore. Per prima cosa calcoliamo la distanza di hamming tra du codici ad 8 bit.

Il testo dell'esercizio è il seguente:

Scrivere un programma C che legga da tastiera due numeri ad 8 bit (tra 0 e 255) e ne calcoli la distanza di Hamming, vale a dire il numero di bit diversi.

Una possibile soluzione è la seguente:
// Tizio - Pinco - 3°AIN - 08/03/2002
// Calcola la distanza di Hamming tra due char

#include <stdio.h>
#define DIM 8		/* Dimensione del dato - 8 bit */

int disth(int vetA[],int vetB[]);// Conta i 'bit' diversi tra vetA e vetB
void numToBin(int n,int vet[]);	// Converte un numero da intero a base 2
void visVet(int []);		// visualizza un vettore
void azzera(int []);		// azzera un vettore

main()
{
int vetA[DIM], vetB[DIM];	// I due codici da convertiti da confrontare
int a,b;			// I due codici inseriti da tastiera

  // Inizializza i codici convertiti
  azzera(vetA);
  azzera(vetB);
	
  // Legge primo codice
  do{
    printf("A = ");
    scanf("%d",&a);
  }while(a<0 || a>255);	// Verifica che sia nel campo accettabile
	
  // Legge secondo codice
  do{
    printf("B = ");
    scanf("%d",&b);
  }while(b<0 || b>255);	// Verifica che sia nel campo accettabile

  numToBin(a,vetA);	// Converte primo codice
  numToBin(b,vetB);	// Converte secondo codice
	
  visVet(vetA); 
  visVet(vetB);
  // Calcola la distanza di hamming e la stampa
  printf("\nDistanza di Hamming: %d\n",disth(vetA,vetB));
}

/* Calcila la distanza di hamming tra i codici, vale a dire
 * il numero di bit che cambiano tra l'uno e l'altro
 */
int disth(int vetA[],int vetB[])
{
int i;		// Indice del bit
int hamm=0;	// Distanza
  for(i=0;i<DIM;i++)		// Analizza tutti i bit
  {
    if(vetA[i]!=vetB[i])	// Se i bit sono diversi
    {
      hamm++;			// Conta la differenza
    }
  }
  return hamm;
}

/* Converte un numero da intero a base 2
 *
 * Il numero viene passato nel parametro 'n'.
 * Il vettore 'vet' viene riempito con le singole cifre del numer convertito, a partire
 * dall'ultimo elemento ( vet [DIM-1]) che conterra' la cifra meno significativa.
 * Quando il numero immesso e' esaurito, le restanti cifre del vettore non vengono 
 * inizializzate
 */
void numToBin(int n,int vet[])
{
int j=0;	// Contatore

  while(n!=0)             
  {                       
    vet[DIM-1-j]=n%2;	// Estrae la cifra meno significativa e la mette nel vettore   
    n=n/2;		// Divide per la base, eliminando la cifra meno significativa
    ++j;		// Incrementa il contatore
  }
}

// visualizza un vettore
void visVet(int vet[])
{
int i;	// Indice
  for(i=0;i<DIM;i++)	// Tutte le cifre, dalla piu' significativa
  {
    printf("%2d",vet[i]);	// Stampa la cifra corrente
  }
  printf("\n");
}

void azzera(int vet[])
{
int i;	// Indice
  for(i=0;i<DIM;i++)	// Tutte le cifre
  {
    vet[i]=0;	// Le azzera
  }
}

Per provare il programma, scaricare il sorgente, compilarlo con il comando cc disth.c ed eseguirlo con il comando ./a.out.


[Home Page dell'ITIS "Fermi"] [Indice Terza] [Precedente] [Successivo]

© Ing. Stefano Salvi - Released under GPL licence