mysql - 位操纵器如何在 mySQL 中工作(以本例为例)
问题描述
这是位操作的示例。我不明白如何(id+1)^1-1
给出显示的输出值。请帮忙。
位操作表达式(id+1)^1-1
可以计算切换后的新id。
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 |
解决方案
^是按位异或运算符。按位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, 3
(with f(x) = x-1
and g(x) = x+1
),为您提供最终的 formula ((id-1)^1)+1
。
推荐阅读
- python - 在 python3 C 扩展中跟踪令人讨厌的内存泄漏
- reactjs - react-select 2下没有空间时如何有条件地在顶部显示项目
- visual-studio-code - Visual Studio Code - 使用制表键缩进单行
- delphi - Delphi 动态创建 ADOStoredProcedure 参数
- java - html + Java | 从输入类型 =“时间”接收 0
- keycloak - 无法通过 keycloak admin api 注册预期的密码盐值
- r - 如何从包含 R 中的字符串元素的列表中创建变量?
- javascript - 将 Angular4 中的 [ngStyle] 绑定到 ngModel 或 2 路绑定
- elasticsearch - 在 PCF 抛出错误中创建的 Syslog Drain
- logstash - filebeat.yml.rpmnew 或 filebeat.yml