Lettura e cambiamento di bit in c uint32_t
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
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;
.