Я видел в изрядном количестве Java кода что-то вроде этого:Отрицание Интс в Java
int blah = ~someFunc() + 1;
вместо
int blah = -1 * someFunc();
есть ли реальная разница в результатах здесь? Явак распознает разницу между этими двумя случаями? Кажется, компилятор должен иметь возможность преобразовать эти две строки в один и тот же байтовый код.
Редактировать: Это не о , так как бит работает, это вопрос о том, почему разработчик может выбрать определенный подход к операции.
Edit2: Я сделал javap -c на простом тесте и вот некоторые JVM байт-код:
int one = -1 * someFunc();
0: iconst_m1
1: invokestatic #2 // Method someFunc:()I
4: imul
5: istore_1
int two = ~someFunc() + 1;
6: invokestatic #2 // Method someFunc:()I
9: iconst_m1
10: ixor
11: iconst_1
12: iadd
13: istore_2
Таким образом, есть еще 3 ява инструкции для битном флипа (который iconst_m1, ixor
) плюс один, но, как это переводится в машинные циклы, вероятно, очень специфично для архитектуры.
Компилятор/интерпретатор не может быть достаточно умен, чтобы различать во всех случаях, но я думаю, что то, что вы видите, - это просто прихоть программиста, как он это делает. В великой схеме вещей '*' * может быть немного менее эффективным, но я сомневаюсь в этом. Может быть, программист демонстрирует свои побитовые знания? ;) – lurker
Возможный дубликат [Как работает оператор побитового дополнения (~)?] (Http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work) –
@RamanShrivastava I не думайте, что это дубликат. OP не спрашивает *, как * '~' используется для отрицания значения (как он работает). OP задается вопросом, почему * он используется вместо '-1 *'. – lurker