На самом деле вы выполняете только четыре вычисления, поэтому удобочитаемость здесь кажется гораздо важнее , чем эффективность. Мой подход сделать что-то вроде этого более читабельным -
- Извлечение общего кода в функцию
- Соедините похожие вычисления, чтобы сделать шаблоны более очевидными
- Избавьтесь от промежуточной переменной print_zeroes и опишите явно случаи, когда вы выводите байты, даже если они равны нулю (т. Е. Предыдущий байт был ненулевым)
Я изменил блок случайного кода на функцию и изменил несколько переменных (подчеркивание вызывает у меня проблемы на экране предварительного просмотра уценки). Я также предположил, что bytes передается и тот, кто передает его, передаст нам указатель, чтобы мы могли его изменить.
Вот код:
/* append byte b to stream, increment index */
/* really needs to check length of stream before appending */
void output( int i, unsigned char b, char stream[], int *index )
{
printf("byte %d: 0x%02x\n", i, b);
stream[(*index)++] = b;
}
void answer( char bytestream[], unsigned int *bytes, unsigned int n)
{
/* mask out four bytes from word n */
first = (n & 0xFF000000) >> 24;
second = (n & 0x00FF0000) >> 16;
third = (n & 0x0000FF00) >> 8;
fourth = (n & 0x000000FF) >> 0;
/* conditionally output each byte starting with the */
/* first non-zero byte */
if (first)
output( 1, first, bytestream, bytes);
if (first || second)
output( 2, second, bytestream, bytes);
if (first || second || third)
output( 3, third, bytestream, bytes);
if (first || second || third || fourth)
output( 4, fourth, bytestream, bytes);
}
Еще немного эффективнее, и может быть легче понять, будет ли это изменение последних четырех операторов if:
if (n>0x00FFFFFF)
output( 1, first, bytestream, bytes);
if (n>0x0000FFFF)
output( 2, second, bytestream, bytes);
if (n>0x000000FF)
output( 3, third, bytestream, bytes);
if (1)
output( 4, fourth, bytestream, bytes);
Я согласен, однако, что сжатие этого поля делает конечный автомат получения слишком сложным. Но если вы не можете изменить протокол, этот код будет намного легче читать.