Ну если уж гоутушить, то хоть так: if (ulaw&0x40) { xexp = 7 << 4; goto l1; }
else if (ulaw&0x20) { xexp = 6 << 4; goto l2; }
else if (ulaw&0x10) { xexp = 5 << 4; goto l3; }
else if (ulaw&0x08) { xexp = 4 << 4; goto l4; }
else if (ulaw&0x04) { xexp = 3 << 4; goto l5; }
else if (ulaw&0x02) { xexp = 2 << 4; goto l6; }
else if (ulaw&0x01) { xexp = 1 << 4; goto l7; }
else { xexp = 0; goto l8; }
l1: samp>>=1;
l2: samp>>=1;
l3: samp>>=1;
l4: samp>>=1;
l5: samp>>=1;
l6: samp>>=1;
l7: samp>>=1;
l8:
Нет расходов времени на цепочечные goto когда уже ясно, что остались одни сдвиги
А уже это очевидно заменяется на
if (ulaw&0x40) { xexp = 7 << 4; }
else if (ulaw&0x20) { xexp = 6 << 4; }
else if (ulaw&0x10) { xexp = 5 << 4; }
else if (ulaw&0x08) { xexp = 4 << 4; }
else if (ulaw&0x04) { xexp = 3 << 4; }
else if (ulaw&0x02) { xexp = 2 << 4; }
else if (ulaw&0x01) { xexp = 1 << 4; }
else { xexp = 0; }
switch(xexp) {
case 7 << 4: samp>>=1;
case 6 << 4: samp>>=1;
case 5 << 4: samp>>=1;
case 4 << 4: samp>>=1;
case 3 << 4: samp>>=1;
case 2 << 4: samp>>=1;
case 1 << 4: samp>>=1;
default:
} Что, впрочем, может оказаться несколько дольше.
А вот тут
if (ulaw&0x40) { xexp = 7; }
else if (ulaw&0x20) { xexp = 6; }
else if (ulaw&0x10) { xexp = 5; }
else if (ulaw&0x08) { xexp = 4; }
else if (ulaw&0x04) { xexp = 3; }
else if (ulaw&0x02) { xexp = 2; }
else if (ulaw&0x01) { xexp = 1; }
else { xexp = 0; }
switch(xexp) {
case 7: samp>>=1;
case 6: samp>>=1;
case 5: samp>>=1;
case 4: samp>>=1;
case 3: samp>>=1;
case 2: samp>>=1;
case 1: samp>>=1;
default:
}
xexp <<= 4;
или тут (ещё более грубый намёк компилятору)
if (ulaw&0x40) { xexp = 0; }
else if (ulaw&0x20) { xexp = 1; }
else if (ulaw&0x10) { xexp = 2; }
else if (ulaw&0x08) { xexp = 3; }
else if (ulaw&0x04) { xexp = 4; }
else if (ulaw&0x02) { xexp = 5; }
else if (ulaw&0x01) { xexp = 6; }
else { xexp = 7; }
switch(xexp) {
case 0: samp>>=1;
case 1: samp>>=1;
case 2: samp>>=1;
case 3: samp>>=1;
case 4: samp>>=1;
case 5: samp>>=1;
case 6: samp>>=1;
default:
}
xexp = (7 - xexp) << 4;
компилятор может догадаться использовать вычисляемый goto.
И в "безгоутушных" вариантах в принципе может догадаться скомпилировать то же самое, что в первом, так как значение xexp "предсказуемо" и лишние проверки не нужны.
Но это должен быть хороший компилятор. Иначе вариант с явными goto будет быстрее.