как хранить 8 бит в символе с помощью C - PullRequest
4 голосов
/ 20 июля 2010

Я имею в виду, что если я хочу сохранить, например, 11110011, я хочу сохранить его точно в 1 байт в памяти, а не в массиве символов.

Пример: если я запишу 10001111 в качестве входных данных, когда используется scanf, он получит только первую 1 и сохранит ее в переменной, в то время как я хочу получить все значение в переменной типа char, чтобы он занимал только один байт памяти. *

Ответы [ 5 ]

14 голосов
/ 20 июля 2010

Один из способов записать это будет примерно так:

unsigned char b = 1 << 7 |
                  1 << 6 |
                  1 << 5 |
                  1 << 4 |
                  0 << 3 |
                  0 << 2 |
                  1 << 1 |
                  1 << 0;

Вот фрагмент, чтобы прочитать его из строки:

int i;
char num[8] = "11110011";
unsigned char result = 0;

for ( i = 0; i < 8; ++i )
    result |= (num[i] == '1') << (7 - i);
11 голосов
/ 20 июля 2010

вот так ....

unsigned char mybyte = 0xF3;
7 голосов
/ 20 июля 2010

Использование "битового поля"?

#include <stdio.h>

union u {
   struct {
   int a:1;
   int b:1;
   int c:1;
   int d:1;
   int e:1;
   int f:1;
   int g:1;
   int h:1;
   };
   char ch;
};

int main()
{
   union u info;
   info.a = 1; // low-bit
   info.b = 1;
   info.c = 0;
   info.d = 0;
   info.e = 1;
   info.f = 1;
   info.g = 1;
   info.h = 1; // high-bit
   printf("%d %x\n", (int)(unsigned char)info.ch, (int)(unsigned char)info.ch);
}
4 голосов
/ 20 июля 2010

Вам нужно вычислить число, а затем просто сохранить его в символе.

Если вы знаете, как работает бинарный файл, вам будет легко. Я не знаю, как у вас хранятся двоичные данные, но если они в строке, вам нужно пройти через них и для каждого 1 добавить соответствующую степень двойки к временной переменной (инициализируется сначала нулем). Это даст вам число после того, как вы пройдете весь массив.

Смотрите здесь: http://www.gidnetwork.com/b-44.html

1 голос
/ 20 июля 2010

Используйте беззнаковый символ и затем сохраните в нем значение. Простой

Если вы прочитали его из файла, и он находится в форме строки, то что-то вроде этого должно работать:

char str[] = "11110011";
unsigned char number = 0;

for(int i=7; i>=0; i--)
{
    unsigned char temp = 1;
    if (str[i] == '1')
    {
        temp <<= (7-i);
        number |= temp;
    }
}
...