Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] "Girare" i bit di un numero

    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
    codice:
        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:
    codice:
    void reverse_byte(char* byte) {
      unsigned short int new_byte = (unsigned short int)byte;
      new_byte = ntohs(new_byte);
      new_byte = new_byte >> 8;
    }

  2. #2
    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ì:
    codice:
    new_byte = new_byte >> 4;
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    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

  4. #4
    Ah, quindi una specie di "specchiatura" dei bit giusto? Allora si può fare così (premettendo che non so nulla di ntohs e simili)...
    codice:
    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;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    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)...
    codice:
    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...

  6. #6
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    codice:
    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;
    }
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  7. #7
    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
    Experience is what you get when you don’t get what you want

  8. #8
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    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.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  9. #9
    Scusate non avevo capito il significato del termine "capovolgimento"
    Experience is what you get when you don’t get what you want

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.