2015-11-02 19 views
7

Voglio verificare se gli 8 bit in un char sono una sottostringa dei 32 bit di un int.C - Come verificare se 8 bit sono a 32 bit?

a = 0110 1010 1011 0100 0000 0110 1010 0010 (32 bit int) 
b = 0100 0000 (8 bit char) 

is_in(a, b) --> true 

Ecco il mio codice:

for (int i = 0; i < 25; i++) { 
     int tmp = a; 
     tmp <<= 24; 
     tmp >>= 24; 
     int res = b^tmp; 
     res <<= 24; 
     res >>= 24; 
     if (res == 0) 
      return 1; 
     else 
      a >>= 1; 
    } 
    return 0; 

lo voglio più efficiente. Qualche idea?

+3

Può 'B' essere ovunque "in"' a', o solo su-byte confini? E cosa hai provato finora? Quali problemi hai riscontrato con il tuo codice? –

+1

Parole chiave: spostamento, maschera e confronto. Utilizzare gli operatori '<<' or '>>' e l'operatore '&'. Vieni con una soluzione e poi fai domande quando hai difficoltà. –

+0

Se gli 8 bit possono essere solo su una determinata posizione di 32 bit int, è possibile azzerare tutti gli altri con le operazioni AND e confrontare direttamente i valori. – Magisch

risposta

5

Beh, si potrebbe provare ...

bool is_in(uint32_t a, uint8_t b) { 
    while (a >= b) { 
    if ((a & 0xff) == b) return true; 
    a >>= 1; 
    } 
    return false; 
} 
+1

In aumento per l'utilizzo di 'unsigned' per entrambi gli argomenti, altrimenti si finisce con 1 in cui viene spostato. – dbush

+1

soluzione interessante, grazie :) – Johny

+1

La soluzione ovvia. –

Problemi correlati