Что функция делает ^
(каре) подача оператора в Java?
Когда я пробую это:
int a = 5^n;
... это дает мне:
для n = 5, возвраты 0
для n = 4, возвраты 1
для n = 6, возвраты 3
... таким образом, я предполагаю, что это не выполняет возведение в степень. Но что это затем?
Как уже указывали многие, это оператор 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.
От здесь.
Эти операторы могут пригодиться, когда необходимо читать и записывать в целые числа, где отдельные биты должны интерпретироваться как флаги, или когда определенный диапазон битов в целом числе имеет особое значение, и вы хотите извлечь только их. Можно много заниматься ежедневным программированием без необходимости использования этих операторов, но если Вам когда-нибудь придется работать с данными на уровне битов, то хорошее знание этих операторов бесценно.
. ^
в 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 нет такого оператора. Вы можете использовать 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
Это битовый оператор xor в java, который дает 1 для разного значения (т.е. 1 ^ 0 = 1) и 0 для одного и того же значения (т.е. 0 ^ 0 = 0).
.Как уже говорилось в другом ответе(ах), это оператор "эксклюзивный или" (XOR) . Подробнее о битовых операторах на Java смотрите: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
Как говорили другие, это кусочек XOR. Если вы хотите поднять число до заданной мощности, используйте Math.pow(a , b)
, где a
- число, а b
- мощность.
Это битовый XOR, в Java нет оператора экспоненции, вместо него нужно использовать Math.pow()
.
Ссылка AraK указывает на определение исключительного-или, которое объясняет, как эта функция работает для двух булевых значений.
Недостающая часть информации о том, как это относится к двум целым числам (или значениям целочисленного типа). Побитовое эксклюзив-или применяется к парам соответствующих двоичных цифр в двух числах, а результаты повторно собираются в целое число.
Чтобы использовать ваш пример:
Простой способ определить двоичное представление XOR - это сказать, что результат имеет 1 в каждом месте, где два входных числа различаются.
С 4 и 5, единственное различие находится в последнем месте; поэтому
0101 ^ 0100 = 0001 (5 ^ 4 = 1) .
..используйте вместо этого Math.pow:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#pow%28double,%20double%29
Это потому, что вы используете оператор xor.
В java или почти любом другом языке ^ - это побитовый xor, так что, конечно,
10 ^ 1 = 11. подробнее о побитовых операторах
Интересно, что в Java и C # нет оператора мощности.
^ является двоичным (как в base-2) xor, а не возведением в степень (которое недоступно в качестве оператора Java). Для возведения в степень см. Java.lang.Math.pow ().
В других языках, таких как Python, вы можете использовать 10 ** 2 = 100, попробуйте.