В одном из комментариев вы сказали, что длина массива равна 64.
Ну, если вы должны сделать это линейно, вы можете сделать:
int i = -1;
do {
if (arr[0] >= key){i = 0; break;}
if (arr[1] >= key){i = 1; break;}
...
if (arr[62] >= key){i = 62; break;}
if (arr[63] >= key){i = 63; break;}
} while(0);
Однако я серьезно сомневаюсь, что это быстрее, чем этот бинарный поиск: *
int i = 0;
if (key >= arr[i+32]) i += 32;
if (key >= arr[i+16]) i += 16;
if (key >= arr[i+ 8]) i += 8;
if (key >= arr[i+ 4]) i += 4;
if (key >= arr[i+ 2]) i += 2;
if (key >= arr[i+ 1]) i += 1;
* Спасибо Джону Бентли за это.
Добавлено: так как вы сказали, что эта таблица подготовлена один раз для большого количества поисков, и вы хотите fast , вы можете выделить где-нибудь место и сгенерировать машинный код со значениями, встроенными в него. Это может быть либо линейный, либо бинарный поиск. Если двоичный код, машинный код будет выглядеть так, как это сгенерирует компилятор из этого:
if (key < value32){
if (key < value16){
...
}
else {
...
}
}
else {
if (key < value48){
...
}
else {
...
}
}
Тогда вы просто копируете это в место, где вы можете это назвать.
ИЛИ вы можете распечатать код выше, скомпилировать и связать его на лету в DLL, и загрузить DLL.