AngoLinux

Funzione AND bit a bit tra due parole binarie

- A cura del Prof. Stefano Salvi -


Introdciamo a questo punto il concetto di opearazione bit a bit, facendone implementare una tra due numeri binari immagazzinati in vettori.

Il testo dell'esercizio è il seguente:

Scrivere un programma C che:
  • Legga due numeri tra 0 e 255 (controllando il numero immesso)
  • Li converta in binario, mettendoli in due vetori da 8 interi, un bit per intero
  • Esegua l'operazione AND bit a bit tra i due numeri, mettendo il risultato in un terzo vettore
  • Stampi i due numeri convertiti in binario ed il risultato dell'operazione logica
Utilizzare delle funzioni con i parametri per i vari compiti.

Una possibile soluzione è la seguente:
// Tizio - Pinco - 3AIN - 08/02/02 
// Realizza la funzione AND bit a bit tra due parole binarie
// (senza utilizzare l'operatore unario &)

#include <stdio.h>

#define DIM 8	/* Dimensione del dato */

void binario(int n,int vet[]);			// Converte il numero 'n' nel vettore 'vet'
void and(int vetA[],int vetB[],int vetC[]);	// Esegue l' AND tra vetA e vetB e lascia il
						// risultato in vetC
void visualizza (int vet []);			// Visualizza il vettore 'vet'
 
main()
{
int vetA[DIM];	// Primo operando in binario
int vetB[DIM];	// Secondo operando in binario
int vetC[DIM];	// Risultato in binario
int a,b;	// Operandi letti, interi
int j;		// Variabile per ciclo

  // Inizializza i tre 'numeri binari' a 0
  for(j=0;j<DIM;j++)
  {	
    vetA[j]=0;
    vetB[j]=0;
    vetC[j]=0;
  }	
	
  // Legge il primo operando
  do {
    printf("A: "); scanf("%d",&a);
  }while(a<0 || a>255);	// Verifica che sia un numero a 8 bit (0..255)

  // Legge il secondo operando
  do {	
    printf("B: "); scanf("%d",&b);
  }while(b<0 || b>255);	// Verifica che sia un numero a 8 bit (0..255)
	
  binario(a,vetA);	// Converte il primo operando
  binario(b,vetB);	// Converte il secondo operando
  and(vetA,vetB,vetC);	// Calcola l'operatore

  // Visualizza i risultati
  visualizza (vetA);	
  printf (" and ");
  visualizza (vetB);
  printf (" = ");
  visualizza (vetC);
  printf ("\n");
}

/* converte un intero in binario
 * 
 * Il numero da convertire viene passato in 'n'
 * Il numero convertito viene lasciato in 'vet', il bit
 * piu' significativo in vet [0].
 * Gli elementi piu' significativi del vettore non vengono inizializzati
 */
void binario(int n,int vet[])
{
int j=0;		  // Contatore
  while(n!=0)             // Ciclo, fino a che ci sono bit in 'n'
  {                       
    vet[DIM-1-j]=n%2;     // Mette in 'vet' il bit meno significativo
    n=n/2;                // Elimina il bit convertito
    ++j;                  // Incrementa il contatore
  }
}

/* Calcola l'AND bit a bit tra due vettori di 'bit'
 *
 * I due vettori di DIM elementi di partenza sono 'vetAì e 'vetB'.
 * Il risultato viene lasciato in 'vetC'
 */
void and(int vetA[],int vetB[],int vetC[])
{
int i;		// Contatore
  for(i=0;i<DIM;i++)	// Per ogni elemento del vettore
  {
    if((vetA[i]!=0)  && (vetB[i]!=0)) // And tra le due cifre
    {
      vetC[i]=1;	// Se l'AND da' 'vero', metto 1
    } else {
      vetC[i]=0;	// Altrimenti 0
    }
  }
}

/* Stampa su di una riga gli elementi dell vettore 'binario' vet
 */
void visualizza (int vet [])
{
int i;	// Contatore
  for(i=0;i<DIM;i++)		// Per ogni elemento del vettore
  {
    printf("%2d",vet[i]);	// Lo stampa
  }
}

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


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

© Ing. Stefano Salvi - Released under GPL licence