Вот функция, которая записывает n бит в двоичный файл.Функция оптимизации для записи битов в файл
Параметры:
- данные: Биты последовательности должны быть записаны в файл (LSB справа)
- Длины: Число бит для записи
- 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);
}
}
Оба они делают работу, но второй из них быстрее, чем первый. Любая идея сделать это еще быстрее?
Спасибо всем за помощь!
Спасибо вам ответить. Файл открывается и закрывается только один раз во всей программе. – 2010-12-05 15:58:19