2015-04-02 7 views
5

Ora so come è fatto in una riga, anche se non riesco a capire perché la mia prima bozza non funziona bene. Quello che sto cercando di fare è salvare la parte inferiore in una variabile diversa, spostando il byte più alto a destra e aggiungendo i due numeri tramite OR. Tuttavia, taglia semplicemente la metà inferiore dell'esadecimale e restituisce il resto.Scambio di byte inferiore (0-7) con quello superiore (8-15) uno

short int method(short int number) { 


short int a = 0; 
for (int x = 8; x < 16; x++){ 
    if ((number & (1 << x)) == 1){ 
     a = a | (1<<x); 
    } 
} 

    number = number >> 8; 

short int solution = number | a; 
return solution; 
+0

Attenzione spostando una variabile firmato: il bit del segno può causare un comportamento indefinito. Meglio usare unsigned, o cast per unsigned prima del turno. –

+0

Si sta eseguendo uno spostamento verso destra di un intestazione (breve) con segno - questo si traduce in un comportamento definito dall'implementazione (in genere uno spostamento aritmetico). Utilizzare unsigned (short) ints per evitare questo problema. –

+0

Tracciare questo in un debugger, passare un'istruzione alla volta ed esaminare i valori di ciascuna variabile. – abelenky

risposta

4

if ((number & (1 << x)) == 1)

Questo è solo andare a ritornare vero se x è 0. Dal 1 in binario è 00000000 00000001, e 1 << x sta per impostare tutti, ma il bit x'th a 0.

È don Non importa se è 1 o meno, ti interessa solo se non è zero. Utilizzare

if (number & (1 << x))

+2

Se il bit è impostato, quale sarebbe questa "risposta"? – taclight

+0

'numero & (1 << 8)' restituisce '00000000 00000000' o' 00000001 00000000' a seconda che sia impostato l'ottavo bit. 'number & (1 << 9)' restituisce '00000000 00000000' o' 00000010 00000000' a seconda che sia impostato il 9 ° bit. 'number & (1 << 10)' restituisce '00000000 00000000' o' 00000100 00000000' a seconda che sia impostato il 10 ° bit, & ct & ct. – QuestionC

+0

Quindi, non restituisce 1 in ogni caso. – QuestionC

8

Lo stai facendo un po 'alla volta; un approccio migliore sarebbe farlo con una sola operazione:

uint16_t method(uint16_t number) { 
    return (number << 8) | (number >> 8); 
} 

Il codice di cui sopra specifica a 16 bit tipo unsigned esplicitamente, evitando così le questioni relative a firmare l'estensione. È necessario includere <stdint.h> (o <cstdint> in C++) affinché questo possa essere compilato.

Problemi correlati