Прежде всего, вам нужно написать код, чтобы он был понятен. Я не могу легко понять ни один из ваших фрагментов кода. Вот попытка переформатировать и реорганизовать первый, который будет проще, и добавить несколько комментариев:
/**
* @brief Write some bits to a file.
*
* The bits are written MSB-first to a temporary 64-bit integer, which is
* then written to the file in host byte-order.
*
* @param Data The data to write to the file. Only the least-significant
* Length bits are written. Of the bits that are written, the
* most significant bit is written first.
* @param Length The length of the data to write, in bits. Must be <= 64.
* @param OutFile The file to write to
*
* @note This function is not thread-safe
* @note This function stores some state in a static variable. You must
* ensure that the total data written is a multiple of 64 bits, or
* some data will be lost. You can only switch from one OutFile to
* another on a 64-bit boundry.
*/
void WriteBitsToFile(unsigned long long Data,
unsigned Length,
std::ofstream & OutFile)
{
static unsigned long long BitBuffer = 0;
static unsigned BitCounter = 0;
// Loop through input bits, one bit at a time
for (int i = (int)Length; i >= 0; --i)
{
// Get the input bit
unsigned long long NextBit = ((Data >> i) & 1);
// Add it to the temporary buffer
BitBuffer = ((BitBuffer << 1) | NextBit);
BitCounter++;
// If the temporary buffer is full, write it out
if (BitCounter == 64)
{
OutFile.write((char *) & BitBuffer, sizeof(BitBuffer));
BitCounter = 0;
}
}
}
Теперь, когда я понимаю, что вы пытаетесь сделать ...
Ваша вторая версия выглядит намного лучше, потому что вы избегаете петли за бит. Поскольку вы спрашиваете об оптимизации этого, я предполагаю, что у вас есть результаты профилирования, которые показывают, что это медленно? И я предполагаю, что вы кладете много данных через это?
Одной из возможных оптимизаций является запись в гораздо больший буфер (я бы предложил по крайней мере 4 КБ). Это означает, что вам не нужно вызывать write () так часто. Вызов write () может быть относительно медленным.