2014-10-22 3 views
0

Если у меня есть целое число без знака от 0 до 16, и я хочу записать его в двоичный файл, не записывая для него целый байт, как бы один сдвинуть бит для его достижения?Запись 4 битов в двоичный файл с потоком

0-16 означает, что мне нужны только 4 бита, поэтому я должен иметь возможность хранить 2 разных номера в одном байте вправо?

Следующий код записывает 1 номер на 1 байт:

std::ofstream file; 
file.open("test.bin", std::ios::binary|std::ios::out); 
char oneByteNum = (char)fourByteNum; // Converting from some 4 byte integer to a 1 byte char 
file.write(&oneByteNum ,sizeof(char)); 

Использование bitshifts, как можно достичь 2 числа в 1 байт? Я полагаю, что чтение номера из байта будет аналогичным, обратным 2-ступенчатым процессом?

+0

'char oneByteWithTwoNums = (oneByteNum1 << 4) | (oneByteNum2 & 0x0F); ' –

ответ

3
char oneByteWithTwoNums = (oneByteNum1 << 4) + (oneByteNum2 & 0x0f); 
+0

Возможно, вы захотите замаскировать' oneByteNum2'. –

+0

Вы правы. Я не заметил, что он забыл подтверждение ввода. См. Править. – Silicomancer

1

Попробуйте это:

Для расширения:

second_number = compacted & 0x0F; 
    first_number = compacted >> 4; 
1

Я написал быстрый пример:

#include <iostream> 

typedef unsigned char byte; 

byte pack(unsigned int num1, unsigned int num2) { 

    // Our byte has the form 0b00000000 
    // We want the first four bits to be filled with num1 
    byte packed = num1 << 4; 

    // We want the last four bits to be filled with num2 
    // but, we don't want to overwrite the top four bits, so 
    // we mask it with 0x0F (0b0001111) 
    packed |= num2 & 0x0F; 
    return packed; 
} 

void unpack(byte b, unsigned int& num1, unsigned int& num2) { 
    // Extract the first four bits of our byte 
    num1 = b >> 4; 

    // Mask off the first four bits of our byte to get only 
    // the last four bits 
    num2 = b & 0x0F; 
} 

int main() { 

    unsigned int num1 = 5; // As an example 
    unsigned int num2 = 15; // As an example 

    byte b = pack(num1, num2); 

    unsigned int num3; 
    unsigned int num4; 
    unpack(b, num3, num4); 
    std::cout << num3 << std::endl; 
    std::cout << num4 << std::endl; 

    return 0; 
} 

Вы, вероятно, хотите добавить проверку в ваши методы pack/unpack, чтобы кто-то не tr y, передавая значение, отличное от [0-15].

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