2017-02-15 1 views
0

Предположим, что я могу использовать только битовые операторы < <, >>, &Извлечение битов символа в C, используя ограниченные операторы побитового

У меня есть следующие,

unsigned char c = 181; 

Я хочу, чтобы распечатать бит в этом символе от самого значимого бита до наименее значимого бита. Как мне это сделать?

ответ

1

Нанести маску и изолировать один бит за один раз:

int i; 
char c = 181; 
for (i = 7; i >= 0; i--) 
{ 
    putchar((c >> i) & 1 ? '1' : '0'); 
} 
putchar('\n'); 
+2

Эквивалентный способ будет '(с >> я) & 1' –

+1

Вы также лучше обслуживаться с помощью' putchar' для вывода одного символа * *, а не называя вариационная функция 'printf'. –

+0

Отмечено и реализовано. Спасибо за комментарии. – nikaltipar

3

Есть так много различных способов приблизиться к этому, как вы хотите, чтобы исследовать. Вы хотите вывести вывод? Вы хотите включить разделители? (например, 1111-0110)? Вы хотите ограничить вывод на X число бит? И так далее.

Самый простой подход, который вы спрашиваете, но при реализации решения, почему жесткого код ограничение 8-bits, когда вы можете написать простую общую процедуру для обработки любого unsigned типа (до того, что вы задаете как параметр). Кроме того, когда бит-twiddling, рекомендуется использовать точные типы размеров (например, uint8_t, ... uint64_t), поэтому нет никаких шансов на разницу в платформе. (точные типы определены в stdint.h) Соответствующие макросы преобразования для точных типов ширины представлены в inttypes.h.

Ввод куски вместе, вы можете написать свой отпечаток на без ведущего двоичного представления любого значения типа до uint64_t что-то вроде следующего:

/** unpadded binary representation of 'v'. */ 
void binprn (const uint64_t v) 
{ 
    if (!v) { putchar ('0'); return; };  /* handle v = 0 simply */ 

    size_t sz = sizeof v * CHAR_BIT;   /* set the number of bits */ 
    uint64_t rem = 0;       /* value holding remaining bits */ 

    while (sz--)        /* for each bit */ 
     if ((rem = v >> sz))     /* if bits remain */ 
      putchar ((rem & 1) ? '1' : '0'); /* output the bit */ 
} 

Собираем вместе с коротким, например, для c = 181, вы могли бы сделать что-то вроде:

#include <stdio.h> 
#include <limits.h>  /* for CHAR_BIT */ 
#include <stdint.h>  /* for exact size type ints */ 
#include <inttypes.h> /* conversion macros for exact size types */ 

/** unpadded binary representation of 'v'. */ 
void binprn (const uint64_t v) 
{ 
    if (!v) { putchar ('0'); return; };  /* handle v = 0 simply */ 

    size_t sz = sizeof v * CHAR_BIT;   /* set the number of bits */ 
    uint64_t rem = 0;       /* value holding remaining bits */ 

    while (sz--)        /* for each bit */ 
     if ((rem = v >> sz))     /* if bits remain */ 
      putchar ((rem & 1) ? '1' : '0'); /* output the bit */ 
} 

int main (void) { 

    uint8_t c = 181; 

    printf ("The bits in unsigned char c = '%" PRIu8 "' are:\n\n ", c); 
    binprn (c); 
    putchar ('\n'); /* tidy up */ 

    return 0; 
} 

Пример использования/Выход

$ ./bin/cbits 
The bits in unsigned char c = '181' are: 

    10110101 

Просмотрите все ответы и сообщите мне, если у вас есть вопросы.

+0

Может избежать необходимости в специальном случае 'if (! V) ...' с помощью цикла 'do {} while (sz);'. – chux

+0

Да, и я не сбрасывался на сборку, чтобы проверить, какая разница будет (если она есть) на генерации кода. Я проверю и, если значимо, напишу комментарий. –

2

A простой решение, которое не включает магические числа, такие как 8.

#include <stdio.h> 

void print_out_the_bits(unsigned char x) { 
    if (x > 1) print_out_the_bits(x >> 1); // print most significant bits first 
    putchar("01"[x & 1]); 
} 

int main() { 
    unsigned char c = 181; 
    print_out_the_bits(c); 
} 

Выход

10110101 
+1

И мне нравится индексирование массива строки в 'putchar' - slick. –

+0

@ DavidC.Ранкин мог бы использовать 'putchar ('0' + (x &1));' имеет больше смысла, но OP навязывает побитовое ограничение оператора. Hmmm, is '[]' cheating? – chux

+1

Назовите это «креативностью» вместо «обмана» ':)' –

Смежные вопросы