Что делает оператор ^ в 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
  • Базовая проверка данных, отправляемых по сети.

Множество таких трюков можно сделать с помощью бит-мудрых операторов, интересной темы для изучения.

Ответ 8

Это побитовый оператор xor в java, который приводит к 1 для разного значения бит (т.е. 1 ^ 0 = 1) и 0 для одного значения бита (т.е. 0 ^ 0 = 0), когда число записывается в двоичной форме.

ex: -

Чтобы использовать ваш пример:

Бинарное представление 5 равно 0101. Бинарное представление 4 равно 0100.

Простым способом определения Побитового XOR является утверждение, что результат имеет 1 в каждом месте, где два входных числа отличаются.

0101 ^ 0100 = 0001 (5 ^ 4 = 1).

Ответ 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