2013-03-26 10 views
5

Ho un file binario che verrà letto come caratteri. Ogni personaggio è stato spostato un po 'verso sinistra, un numero imprecisato di volte (assumendo con un involucro) da qualcun altro. Voglio essere in grado di leggere in ogni personaggio e poi avvolgere il turno a destra (il numero di volte per lo spostamento immagino che dovrà essere calcolato manualmente, perché non ho capito un altro modo).Bit che sposta un personaggio con un wrap? C++

Quindi, la mia idea attuale è che ho letto in un personaggio, creare una copia con temp e quindi utilizzare XOR:

char letter; //will hold the read in letter 
char temp;  //will hold a copy of the letter 
while(file.read(&letter, sizeof(letter)) //letter now holds 00001101 
{ 
    temp = letter; //temp now holds 00001101 
    letter >>= 1; //shift 1 position to the right, letter now holds 00000110 
    temp <<= 7;  //shift to the left by (8-1), which is 7, temp now holds 10000000 
    letter ^= temp; //use XOR to get the wrap, letter now holds 10000110 
    cout << letter; 
} 

questo ha un senso nella mia testa esausto, ma non funziona .. e non riesco a capire perché. La dimensione del char è di 1 byte, quindi ho capito che devo solo scherzare con 8 bit.

Qualsiasi aiuto sarebbe apprezzato.

MODIFICA: risolto. Grazie mille a tutti. Ama questa comunità fino alla morte, voi ragazzi siete fantastici!

+0

You' ci ha detto cosa ti aspetti - cosa ottieni? –

+0

@sftrabbit Un pasticcio dall'aspetto criptico. –

+0

Stai leggendo 'letter' due volte per ciclo, scartando il valore di prima lettura – jthill

risposta

10

Prestare attenzione al segno di un carattere. Su molti sistemi è firmato. Quindi il tuo letter >>= 1 è un segno che riempie lo spostamento.

interi rotante si realizza come segue

letter = ((unsigned char)letter >> 1) | (letter << 7); 

Come Mark sottolinea nei commenti, è possibile utilizzare uno o | o XOR ^.

+1

BOOM! Ha funzionato il mio amico! Grazie mille. Non ho usato il codice modificato, ma ci proverò. Quello che ho fatto è stato letto in un cast di char per un char non firmato e ha funzionato come un fascino. Grazie mille per aver segnalato la cosa senza firma ... non posso credere di averlo perso. –

+0

Se non ci sono bit sovrapposti, 'or' e' xor' produrranno gli stessi risultati. –

+0

@MarkRansom Hai ragione. Questo non mi è nemmeno passato per la mente. – Kyurem

0

La dichiarazione temp <<= 7 sta perdendo i bit che si desidera avvolgere. Sarà necessario eseguire lo spostamento a sinistra di un bit alla volta. Prima controlla il bit di bit più significativo e, se impostato, spostalo nella parte più a destra prima di eseguire lo spostamento.

+0

temp viene spostato 7 a sinistra perché la lettera viene spostata a destra una volta. Quando uso XOR su entrambi, mi dà quel pezzo che è caduto sul lato destro (e ora è sul lato sinistro, avvolto intorno). –

0

sarei propenso a utilizzare una più grande di tipo integrale:.

unsigned val = (unsigned)letter & 0xFF; 
val |= val << 8; 

Ora non resta che spostare i valori in val, senza alcun codice aggiuntivo per avvolgere i bit alti nel

Problemi correlati