Это классический случай снижения скорости за эффективность памяти. Я предполагаю, что вы работаете в среде, где не хватает памяти, и вам нужно поместить множество элементов в этот массив, иначе это, вероятно, не стоит вашего времени.
Вы можете исключить оператор switch, используя таблицу поиска, чтобы найти правильные значения shift и mask.
short int shift1[4] = { 13, 7, 9, 2 };
short int shift2[4] = { 10, 4, 6, 0 };
short int mask1[4] = { 0xe000, 0x0380, 0x0e00, 0x38 };
short int mask2[4] = { 0x1c00, 0x0700, 0x1c, 0x07 };
int index = value % 4; /* you're not saving any time by using bitwise AND but you are making your code less readable */
value1 = (value & mask1[index]) >> shift1;
value2 = (value & mask2[index]) >> shift2;
Идея состоит в том, что вы устраняете любые ветвления. Однако каждый путь настолько короток, что может не иметь значения. В моем тестировании (gcc на PowerPC) разницы почти не было. Однако пропускная способность памяти на этом компьютере достаточно мала, поэтому обе версии работают быстрее, чем просто прямой доступ к массиву и 1 байт на значение.