Деление на 2 является простым побитовым сдвигом вправо. После упоминания @ elgonzo (теперь удаленного) о свойствах смещения прав в C # я решил посмотреть, как это работает, и кажется, что делает именно то, что вы хотите:
var result = number >> 1;
Это дает следующие результаты:
11 -> 5
10 -> 5
2 -> 1
1 -> 0
-1 -> -1
-2 -> -1
-32 -> -16
-33 -> -17
int.MaxValue и MinValue также работают.
С точки зрения производительности, это, кажется, почти в два раза быстрее, чем принятый в настоящее время ответ, который использует операторы по модулю.
Разделение (одинаковое) 100000000 случайных чисел на моей машине стоит 2,17 секунды, используя простую смену, в то время как использование версии с модулями занимает от 3,1 до 4,0 секунд.
Похоже, что разветвленные версии работают примерно так же, как версия по модулю: значительно медленнее, чем простое смещение прав.