В Си где только можно использую нормальную арифметику вместо битовых операций и не чувствую, что чего-то не хватает.
Вообще в зависимости от компилятора может порождаться разный по быстродействию код. На такой тестовый пример:
int test(int x, int num1, int num2) {
return (x > num1) | ((x < num2) << 2);
}
int test2(int x, int num1, int num2) {
return (x > num1) + (x < num2) * 4;
}
https://godbolt.org/Компилятор clang 3.9.0 генерирует почти одинаковый код, заменив умножение на сдвиг, разница лишь в том, что он оставляет команды or и add.
Компилятор gcc 6.2 тоже генерирует почти одинаковый код, заменив и умножение, и сдвиг на готовую сдвинутую константу (4), и опять разница лишь в том, что он тоже оставляет команды or и add.
А вот компилятор icc 17, как ни странно, генерирует код, соответствующий коду на си -- то есть в первом случае shl и or, а во втором случае imul и add. Не помню, какие там растактовки команд у современных процессоров, но в принципе код от icc может быть медленнее, чем у других компиляторов, ведь обычно команда умножения гораздо сложнее и дольше, чем сдвига (ну по-крайней мере на старых процессорах).
PS. Впрочем, с включенными оптимизациями код сильно меняется, так что может эти рассуждения и бесполезны, хз...