Вопрос-ответ

What does the ^ operator do in Java?

Что делает оператор ^ в Java?

Какую функцию выполняет оператор ^ (caret) в Java?

Когда я пытаюсь это сделать:

int a = 5^n;

...это дает мне:


для n = 5 возвращает 0
для n = 4 возвращает 1
для n = 6 возвращает 3


...итак, я предполагаю, что он не выполняет возведение в степень. Но что это тогда?

Переведено автоматически
Ответ 1

Оператор ^ в Java

^ в Java используется оператор exclusive-or ("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. Вы можете использовать то, что называется схемой Хорнера, которая не только проста, но и эффективна.

Поскольку вы делаете это в качестве личного упражнения, я не буду приводить 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's 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 =>

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
2024-02-05 14:35 java