Domanda

Sto usando questo codice

int get_bit(int n, int bitnr) {
int mask = 1 << bitnr;
int masked_n = n & mask;
int thebit = masked_n >> bitnr;
return thebit;
}

void printbits(uint32_t bits) {
    int i;
    for (i = 0; i < 32; i++)
        printf("%d", get_bit(bits, i));
    printf("\n");
}
.

per ottenere e stampare i bit di un UINT32_T, E in un'altra funzione questo codice

uint32_t bits= 0;
bits|= 1<< 0;
.

Per cambiare il bit più significativo (a sinistra) da 0 a 1.

Il problema è quando si stampa i bit utilizzando la funzione PrintBits, la stampa a destra, ma quando si utilizza printf("%#x", bits); ottenendo il valore esadecimale dei bit come se vengano letti da destra a sinistra!

Quindi gli stampati mi danno '1000000000000000000000000000000000' Ma il valore esagonale stampato è il valore di '000000000000000000000000000000000001'.

Aiuto apprezzato

È stato utile?

Soluzione

Modifica del bit più significativo:

Questa riga:

bits |= 1<< 0;
.

Modifica il bit meno significativo ( LSB ).1 << 0 è uguale a 1, che non è molto significativo :).

Ma, se lo fai:

bits |= 1 << 31;
.

o

bits |= 0x80000000;
.

Avresti effettivamente modificato il bit più significativo ( MSB ).

Stampa il numero in binario:

Il tuo codice sta effettivamente stampando il numero da destra a sinistra.È necessario cambiare il tuo loop per decrementare.

for (i = 31; i >= 0; i--)
.

E se la stampa nel modo sbagliato va bene per te (chissà ...), prova questo:

uint32_t n = 41;
while (n) {
    printf("%d", n & 1);
    n >>= 1;
}
.

Questo può essere facilmente adattato per stampare nel modo corretto utilizzando una funzione ricorsiva:

void printbits(uint32_t n) {
    if (n) {
        printbits(n >> 1);
        printf("%d", n & 1);
    }
}
.

Questo algoritmo funziona per qualsiasi base con modifiche minori.

Altri suggerimenti

Questo codice bits|= 1<< 0; imposta il minimo non il bit più significativo in un numero intero.Lo stesso vale per la tua funzione get_bit: numeri i bit da destra a sinistra.

(1 << 0) è il bit Minima / Strong> significativo.(1 << 31) sarebbe il bit più significativo.

La funzione di stampa sta stampando i bit in ordine crescente (modo errato).È necessario invertire il tuo ciclo for:

for (i = 31; i >= 0; i--)
.

Questo sta cambiando la prima cifra a destra (meno importante bit):

 uint32_t bits= 0;
 bits|= 1<< 0;
.

Usa qualcosa come:

uint32_t bits= 0;
bits |= 0x8000;
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top