Если посмотреть внимательно на метод signum в java.lang.Integer, вычисляющим знак целого числа можно увидеть :
public static int signum(int i) {
// HD, Section 2-7
return (i >> 31) | (-i >>> 31);
}
вместо ожидаемого
public static int signum(int i) {
return i > 0 ? 1 : i < 0 ? -1 : 0;
}
В первом случае используется дополнительно две ячейки памяти, во втором случае больше используется cpu. Тесты показывают, что в java такая реализация не случайна - такое вычисление знака целого числа быстрее... на ~ 5%.
Задавшись вопросом - почему я помню не всю таблицу умножения, а только какие-то узловые точки. Например - я не помню, сколько будет
6 * 9, я помню, что 6 * 9 = 6 * 10 - 6, т.е (6 << 1)
10 - 6. Или сколько будет 5 *
n ? Проще сказать, что это 10 * n / 2 т.е (
n << 1)
10 / 2. Хотя квадраты, конечно же, прожжённое на вечную память.
Почему мы так старательно оптимизируем память, сокращая различные ассоциативные таблицы (карты памяти), превращая их в инструкции для
cpu ?