По просьбе я решил расширить свой комментарий к ответу указательного пальца на полноценный ответ. Хотя его ответ правильный, он излишне сложен. Кроме того, все текущие ответы используют подписанные int
s для представления значений. Это опасно, поскольку смещение вправо отрицательных значений определяется реализацией (т.е. не переносимо), а смещение влево может привести к неопределенному поведению (см. этот вопрос ).
Путем смещения правого бита в положение младшего бита можно выполнить маскирование с помощью 1
. Нет необходимости вычислять новое значение маски для каждого бита.
(n >> k) & 1
Как полная программа, вычисляющая (и впоследствии печатающая) массив однобитовых значений:
#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);
}
Предполагая, что вы хотите вычислить все биты, как в этом случае, а не конкретный, цикл может быть дополнительно изменен на
for(bit = 0; bit < n_bits; ++bit, input >>= 1)
bits[bit] = input & 1;
Это модифицирует input
на месте и, таким образом, позволяет использовать однобитовый сдвиг постоянной ширины, что может быть более эффективным на некоторых архитектурах.