为什么用 XOR 运算会得出非 1 和 0 的结果

2018-06-22 09:31:23 +08:00
 90safe
SELECT ( 1000000000000010 ^ 1111111111111111 ) AS XXX FROM `hash` ORDER BY `XXX` ASC

这样的 SQL 语句运行会变成 140677691470285 这样的结果,正确结果难道不是按位异或比对吗?

2691 次点击
所在节点    程序员
11 条回复
Hieast
2018-06-22 09:35:14 +08:00
你这不是二进制吧,计组的题没刷够
90safe
2018-06-22 09:37:45 +08:00
如果非要说 XOR 不能运行在二进制上,那么转换为十进制的话。
```
SELECT ( 32770 ^ 65535 ) AS XXX FROM `hash` ORDER BY `XXX` ASC
```
得出来的结果是__32765__一点也不科学!
ZEOH
2018-06-22 09:38:15 +08:00
1000000000000010D = 11100011010111111010100100110001101000000000001010B
1111111111111111D = 11111100101000110010110111000101010111000111000111B
异或运算结果:00011111111111001000010011110100111111000111001101B = 140677691470285D
wwqgtxx
2018-06-22 09:40:26 +08:00
一楼说的是你的 1000000000000010 不是二进制而是十进制。。。
maichael
2018-06-22 09:41:43 +08:00
结果是对的,只是以 10 进制的形式显示而已。
90safe
2018-06-22 09:42:28 +08:00
@ZEOH 3Q
joyme
2018-06-22 09:43:52 +08:00
php> $a = 32770 ^ 65535

php> echo $a
32765
php> printf("%b", 32770)
1000000000000010
php> printf("%b", 65535)
1111111111111111
php> printf("%b", 32765)
111111111111101
newtype0092
2018-06-22 09:44:59 +08:00
select conv(conv(1000000000000010, 2, 10) ^ conv(1111111111111111, 2, 10), 10, 2);
newtype0092
2018-06-22 09:45:23 +08:00
二进制十进制转换链接一下
90safe
2018-06-22 09:51:56 +08:00
```
SELECT BIT_COUNT( CONV(1000000000000010001100100110101000101010001100100000011010000000,2,10)^CONV(1111111111111111100001110000000000100000001111011111111111111111,2,10) ) AS XXX FROM `img_hash` ORDER BY `XXX` ASC
```
为啥这样得出来的结果是 0 呢,有的 hash 有结果,有的 hash 不行。我在写图片识别,按汉明距离计算。

@ZEOH @joyme @newtype0092 @maichael
90safe
2018-06-22 10:01:47 +08:00
解决了,我也不知道为什么 hash 太长就会出现转换变 0,把 hash 砍成 4x16 段来比对就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/464922

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX