Що робить ^ оператор у Java?


294

Яку функцію виконує ^оператор (caret) на Java?

Коли я спробую це:

int a = 5^n;

... це дає мені:

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

... тож я здогадуюсь, що це не робить експоненції. Але що це тоді?


5
Чи можете ви опублікувати фактичний код, який ви використовуєте?
Ентоні Форлоні

Я використовую eclipse і це повертає 11. public class SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}

2
На Java ^оператор не призначений для встановлення потужності. Math.powНатомість вам знадобиться . Дивіться відповідь полігенмастильного матеріалу.
Ентоні Форлоні

@WizardOfOdds: погодився, це хороше питання ( ^для експоненції? Це просто здоровий глузд!). Вивчення ОП мови мови Java потребує заохочення.
полігенмастильні матеріали

Відповіді:


419

Оператор ^ на 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

16
просто додати до цієї відповіді, функція, яку шукає ОП, ймовірно, Math.pow (10, 1)
tjohns20,

146

Як вже багато людей зазначили, це оператор 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.

Від сюди .

Ці оператори можуть стати в нагоді, коли вам потрібно читати і записувати в цілі числа, де окремі біти слід інтерпретувати як прапори, або коли певний діапазон бітів у цілому численні має особливе значення, і ви хочете витягти лише ці. Ви можете робити багато щоденного програмування, не потребуючи використання цих операторів, але якщо вам коли-небудь доведеться працювати з даними на бітовому рівні, хороші знання цих операторів неоцінені.


34

Це бітовий XOR, у Java немає оператора експоненції, вам доведеться використовувати Math.pow()замість цього.


20

Правило оператора 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


15

Багато людей вже пояснили, що це таке і як ним можна користуватися, окрім очевидних, що ви можете скористатися цим оператором, щоб зробити безліч фокусів програмування, як

  • XORing всіх елементів булевого масиву підкаже, чи має масив непарна кількість істинних елементів
  • Якщо у вас є масив з усіма числами, що повторюють парне число разів, крім одного, який повторює непарне число разів, це можна знайти, XORing всіх елементів.
  • Зміна значень без використання тимчасової змінної
  • Знаходження відсутнього числа в діапазоні від 1 до n
  • Основна перевірка даних, що надсилаються по мережі.

Багато таких хитрощів можна зробити, використовуючи трохи розумні оператори, цікаву тему для вивчення.


14

Як говорили інші, це біт XOR. Якщо ви хочете підняти число до заданої потужності, використовуйте Math.pow(a , b), де aє число і bє потужність.


13

Правило оператора XOR

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

Побітовий оператор працює на бітах і виконує побітну операцію. Припустимо, якщо a = 60 і b = 13; тепер у двійковому форматі вони будуть наступними -

a = 0011 1100

b = 0000 1101



a^b ==> 0011 1100  (a)
        0000 1101  (b)
        -------------  XOR
        0011 0001  => 49

(a ^ b) will give 49 which is 0011 0001

8

Посилання AraK вказує на визначення ексклюзивного або, яке пояснює, як ця функція працює для двох булевих значень.

Інформація про відсутність полягає в тому, як це стосується двох цілих чисел (або цілочисельних значень). Побітовий ексклюзив - або застосовується до пар відповідних двійкових цифр у двох числах, і результати знову збираються в цілий результат.

Щоб використовувати ваш приклад:

  • Двійкове представлення 5 дорівнює 0101.
  • Двійкове представлення 4 - 0100.

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

З 4 і 5 єдина різниця - на останньому місці; тому

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




7

Саме оператор Bitwise xor в java дає результат 1 для різного значення біта (тобто 1 ^ 0 = 1) і 0 для одного і того ж значення біта (тобто 0 ^ 0 = 0), коли число записується у двійковій формі.

колишній: -

Щоб використовувати ваш приклад:

Двійкове представлення 5 - 0101. Двійкове представлення 4 - 0100.

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

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



2

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


2

^ є бінарною (як у base-2) xor, а не експоненціацією (яка недоступна як оператор Java). Про експоненцію див. Java.lang.Math.pow ().


2

Це оператор XOR. Це використання, щоб робити бітові операції з числами. Це поведінка така, що коли ви робите операцію xor на одних і тих же бітах, скажімо, 0 XOR 0/1 XOR 1, результат дорівнює 0. Але якщо будь-який з бітів інший, то результат дорівнює 1. Отже, коли ви зробили 5 ^ 3, то ви можна переглянути ці числа 5, 6 у їх бінарних формах, і таким чином вираз стає (101) XOR (110), що дає результат (011), десяткове подання якого дорівнює 3.


0

На інших мовах, таких як Python, ви можете зробити 10 ** 2 = 100, спробуйте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.