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

Что функция делает ^ (каре) подача оператора в Java?

Когда я пробую это:

int a = 5^n;

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

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

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

276
задан Nayuki 27 February 2016 в 17:06
поделиться

12 ответов

Как уже указывали многие, это оператор 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.

От здесь.

Эти операторы могут пригодиться, когда необходимо читать и записывать в целые числа, где отдельные биты должны интерпретироваться как флаги, или когда определенный диапазон битов в целом числе имеет особое значение, и вы хотите извлечь только их. Можно много заниматься ежедневным программированием без необходимости использования этих операторов, но если Вам когда-нибудь придется работать с данными на уровне битов, то хорошее знание этих операторов бесценно.

.
144
ответ дан 23 November 2019 в 02:06
поделиться

Оператор ^ в 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 в качестве упражнения по программированию (с этого момента ^ обозначает возведение в степень). Целью ОП было вычислить 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
409
ответ дан 23 November 2019 в 02:06
поделиться

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

.
2
ответ дан 23 November 2019 в 02:06
поделиться

Как уже говорилось в другом ответе(ах), это оператор "эксклюзивный или" (XOR) . Подробнее о битовых операторах на Java смотрите: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

7
ответ дан 23 November 2019 в 02:06
поделиться

Это битовый оператор XOR .

.
17
ответ дан 23 November 2019 в 02:06
поделиться

Как говорили другие, это кусочек XOR. Если вы хотите поднять число до заданной мощности, используйте Math.pow(a , b), где a - число, а b - мощность.

.
14
ответ дан 23 November 2019 в 02:06
поделиться

Это битовый XOR, в Java нет оператора экспоненции, вместо него нужно использовать Math.pow().

.
33
ответ дан 23 November 2019 в 02:06
поделиться

Ссылка AraK указывает на определение исключительного-или, которое объясняет, как эта функция работает для двух булевых значений.

Недостающая часть информации о том, как это относится к двум целым числам (или значениям целочисленного типа). Побитовое эксклюзив-или применяется к парам соответствующих двоичных цифр в двух числах, а результаты повторно собираются в целое число.

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

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

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

С 4 и 5, единственное различие находится в последнем месте; поэтому

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

.

.
8
ответ дан 23 November 2019 в 02:06
поделиться
8
ответ дан 23 November 2019 в 02:06
поделиться

Это потому, что вы используете оператор xor.

В java или почти любом другом языке ^ - это побитовый xor, так что, конечно,

10 ^ 1 = 11. подробнее о побитовых операторах

Интересно, что в Java и C # нет оператора мощности.

6
ответ дан 23 November 2019 в 02:06
поделиться

^ является двоичным (как в base-2) xor, а не возведением в степень (которое недоступно в качестве оператора Java). Для возведения в степень см. Java.lang.Math.pow ().

2
ответ дан 23 November 2019 в 02:06
поделиться

В других языках, таких как Python, вы можете использовать 10 ** 2 = 100, попробуйте.

0
ответ дан 23 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: