Operatori di confronto bit

di il
3 risposte

Operatori di confronto bit

Ciao a tutti!

Nel mio programma devo controllare gli input. Per farlo in maniera concisa, elegante e flessibile ho scelto di utilizzare un intero (a 8 bit) inizialmente posto a 0 e di modificare (con l'operazione di OR logico a bit) un bit specifico qualora un errore di input viene trovato.

Ad esempio:

...
#define ERROR1 4
#define ERROR2 8

result = 0; //00000000
if (sbagliato_primo_input() == true)
result |= ERROR1; // 00000100

if (sbagliato_secondo_input() == true)
result |= ERROR2; // 00001000 oppure 00001100 se è precedentemente caduto anche nell'ERROR1

...
chiaramente le funzioni nelle condizioni sono di invenzione.

Adesso vorrei riconoscere quali errori sono stati fatti per informare l'utente con un solo messaggio (quindi concatenando le stringhe di errore).

La domanda è: come faccio a isolare i singoli bit attivati? Prima di ricorrere allo shift dei bit verso destra, c'è un metodo più intuitivo, che magari usi l'OR o AND logico bit a bit?

Grazie

3 Risposte

  • Re: Operatori di confronto bit

    
    #include<stdio.h>
    typedef enum n_error
    {
      ERROR_1=  1,
      ERROR_2=  2,
      ERROR_3=  4,
      ERROR_4=  8,
      ERROR_5= 16,
      ERROR_6= 32,
      ERROR_7= 64,
      ERROR_8=128,
    } n_error;
    
    char *s_error[]={
      "Nessun errore",
      "Errore numero 1",
      "Errore numero 2",
      "Errore numero 3",
      "Errore numero 4",
      "Errore numero 5",
      "Errore numero 6",
      "Errore numero 7",
      "Errore numero 8"
    };
    
    int gest_err (int mode,int value)
    {
      static errors;
      
      switch (mode)
      {
        case 0:
          errors=value;
          break;
        case 1:
          errors|=value;
          break;
        case 2:
          break;
      }
      return (errors);
    }
    
    int reset_err (int value)
    {
      return (gest_err (0,0));
    }
    
    int set_err (int value)
    {
      return (gest_err (1,value));
    }
    
    int get_err ()
    {
      return (gest_err (2,0));
    }
    
    int show_err ()
    {
      int x,k,err=get_err();
      
      for (k=0;err;k++)
      {
        if(x=err & (1 << k))
        {
          err^=x;
          printf ("%s\n",s_error[k+1]);
          
        }
      }
      
    }
    
    int main()
    {
      reset_err (0);
      
      set_err (ERROR_4);
      set_err (ERROR_6 | ERROR_7);
      show_err ();
      
      return 0;
    }
    
    Saluti,
    Max
  • Re: Operatori di confronto bit

    Ok, grazie tante per al risposta. in realtà cercavo qualcosa che rilevasse gli errori (in fase di show) senza usare lo shift ma mi rendo conto che, se lo si vuole automatizzare con un ciclo e un vettore di messaggi di errori, bisogna passare per forza dallo shift...
    grazie ancora
  • Re: Operatori di confronto bit

    Prego. Usare lo shift e l'AND è la strada più breve e pulita.

    ~Max
Devi accedere o registrarti per scrivere nel forum
3 risposte