Что делает оператор ^ в Java?
Какую функцию выполняет оператор ^
(карет) в Java?
Когда я попробую это:
int a = 5^n;
... это дает мне:
для n = 5, возвращает 0 для n = 4, возвращает 1
для n = 6, возвращает 3
... поэтому я думаю, что он не выполняет возведение в степень. Но что же тогда?
Ответы
Ответ 1
Оператор ^ в Java
^
в Java - это эксклюзивный или ( "xor" ) оператор.
Возьмем 5^6
в качестве примера:
(decimal) (binary)
5 = 101
6 = 110
------------------ xor
3 = 011
Это таблица истинности побитового (JLS 15.22.1) и логическая (JLS 15.22.2) xor:
^ | 0 1 ^ | F T
--+----- --+-----
0 | 0 1 F | F T
1 | 1 0 T | T F
Проще говоря, вы также можете думать о xor как о "том или ином, но не обоим!".
См. также
Экспоненциальность в Java
Что касается целочисленного возведения в степень, к сожалению, Java не имеет такого оператора. Вы можете использовать double Math.pow(double, double)
(при необходимости приведя результат к int
).
Вы также можете использовать традиционный бит-сдвигающий трюк для вычисления нескольких степеней из двух. То есть, (1L << k)
равно двум для k-й степени для k=0..63
.
См. также
Объединить примечание: этот ответ был объединен с другим вопросом, в котором было намерение использовать экспоненцию для преобразования строки "8675309"
в int
без использования Integer.parseInt
в качестве упражнения по программированию (^
обозначает теперь возведение в степень). Целью OP было вычислить 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309
; в следующей части этого ответа указывается, что для этой задачи не требуется возведение в степень.
Схема Хорнера
В соответствии с вашей конкретной потребностью вам фактически не нужно вычислять различные полномочия 10. Вы можете использовать так называемую схему Horner, который не только прост, но и эффективен.
Поскольку вы делаете это как личное упражнение, я не буду давать код Java, но здесь основная идея:
8675309 = 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0
= (((((8*10 + 6)*10 + 7)*10 + 5)*10 + 3)*10 + 0)*10 + 9
Сначала это может выглядеть сложным, но на самом деле это не так. Вы в основном читаете цифры слева направо, и вы умножаете свой результат на 10 до добавления следующей цифры.
В виде таблицы:
step result digit result*10+digit
1 init=0 8 8
2 8 6 86
3 86 7 867
4 867 5 8675
5 8675 3 86753
6 86753 0 867530
7 867530 9 8675309=final
Ответ 2
Как уже отмечалось многими, это оператор XOR. Многие люди также уже указали, что если вы хотите повысить степень участия, вам нужно использовать Math.pow.
Но я думаю, что также полезно отметить, что ^
является лишь одним из семейства операторов, которые в совокупности известны как побитовые операторы:
Operator Name Example Result Description
a & b and 3 & 5 1 1 if both bits are 1.
a | b or 3 | 5 7 1 if either bit is 1.
a ^ b xor 3 ^ 5 6 1 if both bits are different.
~a not ~3 -4 Inverts the bits.
n << p left shift 3 << 2 12 Shifts the bits of n left p positions. Zero bits are shifted into the low-order positions.
n >> p right shift 5 >> 2 1 Shifts the bits of n right p positions. If n is a 2 complement signed number, the sign bit is shifted into the high-order positions.
n >>> p right shift -4 >>> 28 15 Shifts the bits of n right p positions. Zeros are shifted into the high-order positions.
Из здесь.
Эти операторы могут пригодиться, когда вам нужно читать и записывать целые числа, где отдельные биты должны интерпретироваться как флаговые, или когда определенный диапазон бит в целочисленном значении имеет особое значение, и вы хотите извлечь только те из них. Вы можете делать много ежедневных программ, не требуя при этом использования этих операторов, но если вам когда-либо придется работать с данными на уровне бит, то хорошее знание этих операторов неоценимо.
Ответ 3
Побитовое XOR, Java не имеет оператора экспоненции, вместо этого вам придется использовать Math.pow()
.
Ответ 4
Это XOR
побитовый оператор.
Ответ 5
Как говорили другие, он побитовый XOR. Если вы хотите поднять число до заданной мощности, используйте Math.pow(a , b)
, где a
- это число, а b
- мощность.
Ответ 6
Многие многие уже объяснили, что это такое и как его можно использовать, но, кроме очевидного, вы можете использовать этот оператор для выполнения многих трюков программирования, таких как
- XORing всех элементов в булевом массиве скажет вам, имеет ли массив нечетное число истинных элементов
- Если у вас есть массив со всеми номерами, повторяющими четное количество раз, кроме одного, которое повторяется нечетное количество раз, вы можете обнаружить, что XORing все элементы.
- Обмен значениями без использования временной переменной
- Поиск недостающего числа в диапазоне от 1 до n
- Базовая проверка данных, отправляемых по сети.
Множество таких трюков можно сделать с помощью бит-мудрых операторов, интересной темы для изучения.
Ответ 7
вместо этого используйте Math.pow:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#pow%28double,%20double%29
Ответ 8
Это побитовый оператор xor в java, который приводит к 1 для разного значения бит (т.е. 1 ^ 0 = 1) и 0 для одного значения бита (т.е. 0 ^ 0 = 0), когда число записывается в двоичной форме.
ex: -
Чтобы использовать ваш пример:
Бинарное представление 5 равно 0101.
Бинарное представление 4 равно 0100.
Простым способом определения Побитового XOR является утверждение, что результат имеет 1 в каждом месте, где два входных числа отличаются.
0101 ^ 0100 = 0001 (5 ^ 4 = 1).
Ответ 9
Как уже было сказано другим ответом, это "эксклюзивный или" (XOR) оператор. Для получения дополнительной информации о битовых операторах в Java см.: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
Ответ 10
Ссылка AraK указывает на определение эксклюзивного или, что объясняет, как эта функция работает для двух логических значений.
Отсутствует информация о том, как это относится к двум целым числам (или значениям целочисленного типа). Побитовое исключение - или применяется к парам соответствующих двоичных цифр в двух числах, а результаты снова собираются в целочисленный результат.
Чтобы использовать ваш пример:
- Бинарное представление 5 равно 0101.
- Двоичное представление 4 равно 0100.
Простым способом определения побитового XOR является утверждение, что результат имеет 1 в каждом месте, где два входных числа отличаются.
С 4 и 5 единственное различие находится на последнем месте; так
0101 ^ 0100 = 0001 (5 ^ 4 = 1).
Ответ 11
Это потому, что вы используете оператор xor.
В java или почти любом другом языке ^ побитовое xor,
поэтому, конечно,
10 ^ 1 = 11.
больше информации о побитовых операторах
Интересно, как Java и С# не имеют оператора питания.
Ответ 12
Правило оператора XOR = >
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
Двоичное представление 4, 5 и 6:
4 = 1 0 0
5 = 1 0 1
6 = 1 1 0
выполните операцию XOR на 5 и 4:
5 ^ 4 => 1 0 1 (5)
1 0 0 (4)
----------
0 0 1 => 1
Аналогично,
5 ^ 5 => 1 0 1 (5)
1 0 1 (5)
------------
0 0 0 => (0)
5 ^ 6 => 1 0 1 (5)
1 1 0 (6)
-----------
0 1 1 => 3
Ответ 13
Это побитовый оператор xor в java, который приводит к 1 для другого значения (т.е. 1 ^ 0 = 1) и 0 для одного значения (т.е. 0 ^ 0 = 0).
Ответ 14
^ является двоичным (как в base-2) xor, а не выражением (что недоступно в качестве Java-оператора). Для возведения в степень, см. Java.lang.Math.pow().
Ответ 15
В других языках, таких как Python, вы можете сделать 10 ** 2 = 100, попробуйте.
Ответ 16
Это оператор XOR. Это используется для выполнения операций с битами по номерам. Он имеет такое поведение, что, когда вы выполняете операцию xor на одних и тех же битах, скажите 0 XOR 0/1 XOR 1, результат равен 0. Но если какой-либо из бит отличается, то результат равен 1.
Итак, когда вы сделали 5 ^ 3, вы можете посмотреть на эти числа 5, 6 в своих двоичных формах и, следовательно, выражение станет (101) XOR (110), которое дает результат (011), десятичное представление которого равно 3.
Ответ 17
Между тем, в Groovy:
def x = 89
def y = 92
print "x ^ y = ${x ^ y}\n"
print "x ** y = ${x ** y}\n"
print "Math.pow(x,y) = ${Math.pow(x,y)}\n"
Выполнение приведенного выше с помощью groovyShell
, например, дает:
x ^ y = 5
x ** y = 220739783027264538664507899981652263884030030210130685655986852988723754592147271358302675499604456885393671329478799379899078505327879299542726514661188445083298962617396644428321
Math.pow(x,y) = 2.2073978302726454E179