Come richiesto, ho deciso di estendere il mio commento sulla risposta dell'indice a una risposta a tutti gli effetti. Sebbene la sua risposta sia corretta, è inutilmente complessa. Inoltre tutte le risposte correnti utilizzano lo int
s firmato per rappresentare i valori. Ciò è pericoloso, poiché lo spostamento verso destra dei valori negativi è definito dall'implementazione (ossia non è trasferibile) e lo spostamento a sinistra può portare a comportamenti non definiti (vedere this question).
Spostando a destra il bit desiderato nella posizione di bit meno significativa, il mascheramento può essere eseguito con 1
. Non è necessario calcolare un nuovo valore di maschera per ogni bit.
(n >> k) & 1
Come un programma completo, l'informatica (e successivamente la stampa) una matrice di valori bit singoli:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
unsigned
input = 0b0111u,
n_bits = 4u,
*bits = (unsigned*)malloc(sizeof(unsigned) * n_bits),
bit = 0;
for(bit = 0; bit < n_bits; ++bit)
bits[bit] = (input >> bit) & 1;
for(bit = n_bits; bit--;)
printf("%u", bits[bit]);
printf("\n");
free(bits);
}
Supponendo che si desidera calcolare tutti i bit come in questo caso, e non uno specifico , il ciclo può essere ulteriormente modificata per
for(bit = 0; bit < n_bits; ++bit, input >>= 1)
bits[bit] = input & 1;
Questa modifica input
in posizione e quindi permette l'uso di una larghezza costante, spostamento singolo bit, che può essere più efficace su alcuni un rchitectures.
'(n >> k) e 1' è altrettanto valido e non richiede calcolando la maschera come la maschera è costante a causa spostamento prima di mascherare anziché l'altro senso in giro. – Joe
@Joe puoi spiegarlo, forse in una risposta, per favore? –
@Yar ha esteso il mio commento un po 'e ha aggiunto una nuova risposta come richiesto – Joe