Що робить оператор ^ (XOR)?


Відповіді:


134

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

Це його таблиця функцій:

a | b | a ^ b
--|---|------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

Ця операція виконується між кожними двома відповідними бітами числа.

Приклад: 7 ^ 10
у двійковому:0111 ^ 1010

  0111
^ 1010
======
  1101 = 13

Властивості: Операція комутативна, асоціативна та самообернена.

Це також те саме, що додавання за модулем 2.


2
ДЯКУЮ!! Я би хотів, щоб просив раніше - майже звів себе з розуму сьогодні вранці. Дякуємо, що забезпечили мені набагато приємніший полудень !!
Hilary Park

Чоловіче, це справді так дуже просто! Я більше працюю над розумінням хеш-алгоритмів, і це дуже постійна операція серед багатьох з них.
Mike Perrenoud

2
Це також те саме, що додавання за модулем 2. - Що мається на увазі під цим?
Раджа Дорджі

@RajaDorji Пояснено тут
mlynn

51

^ є оператором побітового виключає Python . Це те, як ви пишете XORна python:

>>> 0 ^ 0
0
>>> 0 ^ 1
1
>>> 1 ^ 0
1
>>> 1 ^ 1
0

XOR означає ексклюзивне АБО . Він використовується в криптографії, тому що він дозволяє вам "перевертати" біти, використовуючи маску в зворотній операції:

>>> 10 ^ 5
15
>>> 15 ^ 5
10

де 5знаходиться маска; (вхідна маска XOR) Маска XOR знову вводить дані.


5
Таблиця правди говорить правду - і в розмові я зазвичай описую XOR (eXclusive-OR, іноді також відомий як EOR) як "або A, або B, але не обидва, або жоден".
Восьмибітний гуру

2
Дякую!!! Ви та інший респондент напевно зберегли мою розсудливість за цей день - я просто НЕ міг цього зрозуміти, і це було настільки неможливо для Google.
Hilary Park

7

Трохи більше інформації про роботу XOR.

  • XOR число з самим непарною кількістю разів результат є самим числом.
  • XOR кількість парних кількість разів із собою, результат 0.
  • Також XOR з 0 - це завжди саме число.

2

Одне, про що інші відповіді тут не згадують, - це XOR з від’ємними числами -

 a  |  b  | a ^ b
----|-----|------
 0  |  0  |  0
 0  |  1  |  1
 1  |  0  |  1
 1  |  1  |  0

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


Як XOR працює з від’ємними числами:

Оскільки це запитання також позначено як python, я відповім на нього з урахуванням цього. Що виключає АБО ( ^) являє собою логічний оператор , який повертає 1 , коли біти різні і 0 в інших місцях.

Від’ємне число зберігається у двійковому вигляді як доповнення двох . У додатку 2, крайня ліва бітова позиція зарезервована для знака значення (позитивного чи негативного) і не сприяє значенню числа.

У Python від’ємні числа записуються з початковим замість нуля. Отже, якщо ви використовуєте лише 8 бітів для чисел доповнення двох , тоді ви розглядаєте шаблони від 00000000до 01111111як цілі числа від 0 до 127 і резервуєте 1xxxxxxxдля запису від’ємних чисел.

Маючи це на увазі, давайте на прикладі зрозуміємо, як XOR працює з від’ємним числом. Давайте розглянемо вираз - ( -5 ^ -3 ).

  • Двійкове представлення -5може розглядатися як 1000...101і
  • Бінарне представлення -3може розглядатися як 1000...011.

Тут ...позначаються всі 0, кількість яких залежить від бітів, що використовуються для представлення (32-бітні, 64-бітні тощо). Значення 1на MSB (найбільш значущий біт) означає, що число, представлене двійковим поданням, є від'ємним. Операція XOR буде виконуватися на всіх бітах, як зазвичай.

Операція XOR:

      -5   :  10000101          |
     ^                          | 
      -3   :  10000011          |  
    ===================         |
    Result :  00000110  =  6    |
________________________________|


     ∴ -5 ^ -3 = 6

Оскільки MSB стає 0 після операції XOR, тож отримане нами число є додатним числом. Подібним чином, для всіх від’ємних чисел ми розглядаємо їх подання у двійковому форматі, використовуючи доповнення 2 (одне з найбільш часто використовуваних), і робимо простий XOR для їх двійкового подання.

MSB біт результату означатиме знак і інші біти будуть позначати значення кінцевого результату.

Наступна таблиця може бути корисною для визначення ознаки результату.

  a   |   b   | a ^ b
------|-------|------
  +   |   +   |   +
  +   |   -   |   -
  -   |   +   |   -
  -   |   -   |   +

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


1

Ще одна заявка на XORце в ланцюгах. Він використовується для підсумовування бітів.

Коли ви дивитесь на таблицю правди:

 x | y | x^y
---|---|-----
 0 | 0 |  0     // 0 plus 0 = 0 
 0 | 1 |  1     // 0 plus 1 = 1
 1 | 0 |  1     // 1 plus 0 = 1
 1 | 1 |  0     // 1 plus 1 = 0 ; binary math with 1 bit

Ви можете помітити, що результат XORx додається з y, не відстежуючи біт перенесення, біт перенесення отримується з ANDміж x і y.

x^y // is actually ~xy + ~yx
    // Which is the (negated x ANDed with y) OR ( negated y ANDed with x ).

1

Оператор (^) XOR генерує 1, коли він застосовується до двох різних бітів (0 та 1). Він генерує 0, коли застосовується до двох однакових бітів (0 і 0 або 1 і 1).

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