PDA

Visualizza la versione completa : [C] "Girare" i bit di un numero


erbedo
27-11-2006, 22:13
Ciao *
sto cercando di girare i bit di un numero. Purtroppo non posso usare le ntohs poiche usando 2 byte e quindi mi sballano, dato che invece io ho un byte solo.

In poche parole io ho un
unsigned char* optiontype = malloc(1);
pero con i bit ordinati in un modo, io li vorrei girare.

Ad esempio, se ho i bit: 01110000 alla fine vorrei ottenere 00001110

La variabile di fine puo essere un int, un char* o altre cose, dopo potrei comunque convertirla..

Ho provato a far qualcosa ma non mi convice per nulla:
void reverse_byte(char* byte) {
unsigned short int new_byte = (unsigned short int)byte;
new_byte = ntohs(new_byte);
new_byte = new_byte >> 8;
}

MItaly
27-11-2006, 22:18
Credo che l'unico errore nel codice che hai postato sia che mentre nel tuo esempio dici di dover shiftare a destra i bytes di 4 posizioni, qui li shifti di 8; correggi così:


new_byte = new_byte >> 4;
.

erbedo
27-11-2006, 22:30
No beh nell'esempio va bene lo shift, ma se ad esempio io ho:
01001100 alla fine vorrei ottenere 00110010 che a questo punto non e' piu uno shift, ma un vero e proprio "capovoltamento" dei bit.

Mi scuso per l'esempio infelice :)

MItaly
27-11-2006, 23:21
Ah, quindi una specie di "specchiatura" dei bit giusto? Allora si può fare così (premettendo che non so nulla di ntohs e simili)...


unsigned char reverse_byte(unsigned char x)
{
x = (x & 0xaa) >> 1 | (x & 0x55) << 1;
x = (x & 0xcc) >> 2 | (x & 0x33) << 2;
x = (x & 0xf0) >> 4 | (x & 0x0f) << 4;
return x;
}

erbedo
28-11-2006, 09:55
Originariamente inviato da MItaly
Ah, quindi una specie di "specchiatura" dei bit giusto? Allora si può fare così (premettendo che non so nulla di ntohs e simili)...


unsigned char reverse_byte(unsigned char x)
{
x = (x & 0xaa) >> 1 | (x & 0x55) << 1;
x = (x & 0xcc) >> 2 | (x & 0x33) << 2;
x = (x & 0xf0) >> 4 | (x & 0x0f) << 4;
return x;
}


Mmm... Mi potresti spiegare perche? Io l'ho provato a fare su carta e non mi viene girato, ma un altro numero :(

Magari mi son sbagliato io pero hp o provato a ricontrollare piu e piu volte e mi viene sempre sbagliato...

Habanero
28-11-2006, 11:25
unsigned char reverse_byte(unsigned char x)
{
unsigned char t;
t=(x & 0x80)>>7 |
(x & 0x40)>>5 |
(x & 0x20)>>3 |
(x & 0x10)>>1 |
(x & 0x08)<<1 |
(x & 0x04)<<3 |
(x & 0x02)<<5 |
(x & 0x01)<<7;

return t;
}

Xaratroom
28-11-2006, 16:57
Perchè non crei una funzione assembly, visto che si integra benissimo con il c e ha l'istruzione ROR op,cl che fa quello che chiedi (rotation right)

es

_Ruota proc near

push bp
mov bp,sp
push cx

mov al,[bp+4]
mov cl,[bp+6]

ror al,cl

pop cx
pop bp

ret
endp

Habanero
28-11-2006, 17:05
non deve fare una rotazione ma il mirroring dei due nibble rispetto alla metà del byte.

1011 0001 deve diventare 1000 1101... con una rotazione questo non lo puoi fare.

Xaratroom
28-11-2006, 17:17
Scusate non avevo capito il significato del termine "capovolgimento"

Loading