Вот функция, которая записывает n битов в двоичный файл.
Параметры:
- Данные: битовая последовательность для записи в файл (младший бит справа)
- Длина: количество бит для записи
- OutFile: файл назначения.
Первая версия функции:
void WriteBitsToFile(unsigned long long Data, unsigned Length, std::ofstream & OutFile) {
static unsigned long long BitBuffer = 0;
static unsigned BitCounter = 0;
for (unsigned i = Length; i --; ) {
(BitBuffer <<= 1) |= ((Data >> i) & 0x1);
BitCounter ++;
if (BitCounter == 64) {
OutFile.write((char *) & BitBuffer, sizeof(BitBuffer));
BitCounter = 0;
}
}
}
Вторая версия:
void WriteBitsToFile(unsigned long long Data, unsigned Length, std::ofstream & OutFile) {
static unsigned long long BitBuffer = 0;
static unsigned FreeBitCounter = sizeof(BitBuffer) << 3;
Data &= (1 << Length) - 1;
if (FreeBitCounter > Length) {
BitBuffer |= (Data << (FreeBitCounter -= Length));
} else if (FreeBitCounter < Length) {
BitBuffer |= (Data >> (Length -= FreeBitCounter));
OutFile.write((char *) & BitBuffer, sizeof(BitBuffer));
BitBuffer = Data << ((sizeof(BitBuffer) << 3) - Length);
FreeBitCounter = (sizeof(BitBuffer) << 3) - Length;
} else {
BitBuffer |= Data;
OutFile.write((char *) & BitBuffer, sizeof(BitBuffer));
BitBuffer = 0; FreeBitCounter = (sizeof(BitBuffer) << 3);
}
}
Оба они делают работу, но второй быстрее, чем первый. Любая идея сделать это еще быстрее?
Всем спасибо за помощь!