Для случайного доступа к отдельным битам предложенный вами макрос хорош так же, как вы собираетесь его получить (при условии, что вы включаете оптимизацию в своем компиляторе).
Если для битов, к которым вы обращаетесь, есть какой-либо паттерн, вы можете добиться большего. Например, если вы часто обращаетесь к парам битов, то вы можете увидеть некоторое улучшение, предоставив метод, позволяющий получить два бита вместо одного, даже если вы не всегда используете оба бита.
Как и в случае любой проблемы с оптимизацией, вам необходимо хорошо знать поведение вашего кода, в частности его схемы доступа в вашем битовом массиве, для значительного улучшения производительности.
Обновление : так как вы получаете доступ к диапазонам битов, вы, вероятно, можете повысить производительность своих макросов. Например, если вам нужно получить доступ к четырем битам, у вас может быть такой макрос:
#define GETBITS_0_4(x,in) (((in)[(x)/8] & 0x0f))
#define GETBITS_1_4(x,in) (((in)[(x)/8] & 0x1e) >> 1)
#define GETBITS_2_4(x,in) (((in)[(x)/8] & 0x3c) >> 2)
#define GETBITS_3_4(x,in) (((in)[(x)/8] & 0x78) >> 3)
#define GETBITS_4_4(x,in) (((in)[(x)/8] & 0xf0) >> 4)
#define GETBITS_5_4(x,in) ((((in)[(x)/8] & 0xe0) >> 5) | (((in)[(x)/8+1] & 0x01)) << 3)
#define GETBITS_6_4(x,in) ((((in)[(x)/8] & 0xc0) >> 6) | (((in)[(x)/8+1] & 0x03)) << 2)
#define GETBITS_7_4(x,in) ((((in)[(x)/8] & 0x80) >> 7) | (((in)[(x)/8+1] & 0x07)) << 1)
// ...etc
Эти макросы вырезают четыре бита из каждой битовой позиции 0, 1, 2 и т. Д. (Чтобы сократить распространение бессмысленных скобок, вы можете использовать встроенные функции для вышеприведенного.) Затем, возможно, определите встроенный функция как:
inline int GETBITS_4(int x, unsigned char *in) {
switch (x % 8) {
case 0: return GETBITS_0_4(x,in);
case 1: return GETBITS_1_4(x,in);
case 2: return GETBITS_2_4(x,in);
// ...etc
}
}
Поскольку это много утомительного стандартного кода, особенно если у вас несколько различных значений ширины, вы можете написать программу для генерации всех функций доступа GETBIT_*
.
(Я заметил, что биты в ваших байтах хранятся в порядке, обратном тому, что я написал выше. Примените соответствующее преобразование, чтобы соответствовать вашей структуре, если вам нужно.)