Как работают битовые манипуляторы в MySQL (с этим примером) - PullRequest
0 голосов
/ 14 июня 2019

Это пример для битовых манипуляций.Я не понимаю, как (id+1)^1-1 дает показанные выходные значения.Пожалуйста, помогите.

Выражение битовой манипуляции (id+1)^1-1 может вычислить новый идентификатор после переключателя.

SELECT id, (id+1)^1-1, student FROM seat;


| id | (id+1)^1-1 | student |

|----|------------|---------|

| 1  | 2          | Abbot   |

| 2  | 1          | Doris   |

| 3  | 4          | Emerson |

| 4  | 3          | Green   |

| 5  | 6          | Jeames  |

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Позвольте мне представить вам, как это делается:

сначала ^ - операция XOR, поэтому:

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

Обратите внимание, что 1 = 001 в двоичном виде (я представил только соответствующие 3 бита для пояснения ниже), например, 2^1 = 010^001:

    010
XOR 001
-------
    011 = 3

id |  binary id | id + 1 | binary id + 1 | binary (id + 1) ^ 1 | decimal (id + 1) ^ 1 | (id + 1) ^ 1 - 1
1  |  001       | 2      | 010           | 011                 | 3                    | 2
2  |  010       | 3      | 011           | 010                 | 2                    | 1
3  |  011       | 4      | 100           | 101                 | 5                    | 4
4  |  100       | 5      | 101           | 100                 | 4                    | 3
5  |  101       | 6      | 110           | 111                 | 7                    | 6
1 голос
/ 14 июня 2019

^ - битовый XOR-оператор.Битовый x XOR 1 переключает последний бит x (1 xor 1 = 0, 0 xor 1 = 1), поэтому он обменивает 0 и 1, 2 и 3 и т. Д.

Так что теперь у вас есть способ поменять местами 0и 1, 2 и 3, или, в этом отношении, места 2 и 3, 3 и 4.

Чтобы использовать это для обмена 1 с 2, 3 и 4, вы можете сначала сопоставить 1, 2, 3, 4 с 2, 3, 4, 5, примените XOR, затем сопоставьте результат обратно с 1, 2, 3, 4.

Функция, которая сопоставляет 1, 2, 3, 4 с 2, 3, 4, 5: f(x) = x+1.Обратное g(x) = x-1.

Итак, что вы получите: h(x) = g( xor1( f(x) ) ).Это в точности ваша формула: примените ^1 к id+1, (id+1)^1, затем отмените подстановку, применив x-1 к этому результату, и вы получите ((id+1)^1)-1.

Другая подстановка была бысопоставить 1, 2, 3, 4 с 0, 1, 2, 3f(x) = x-1 и g(x) = x+1), давая вам окончательную формулу ((id-1)^1)+1.

...