V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
90safe
V2EX  ›  程序员

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

  •  
  •   90safe · 2018-06-22 09:31:23 +08:00 · 2695 次点击
    这是一个创建于 2350 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SELECT ( 1000000000000010 ^ 1111111111111111 ) AS XXX FROM `hash` ORDER BY `XXX` ASC
    

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

    11 条回复    2018-06-22 10:01:47 +08:00
    Hieast
        1
    Hieast  
       2018-06-22 09:35:14 +08:00 via Android
    你这不是二进制吧,计组的题没刷够
    90safe
        2
    90safe  
    OP
       2018-06-22 09:37:45 +08:00
    如果非要说 XOR 不能运行在二进制上,那么转换为十进制的话。
    ```
    SELECT ( 32770 ^ 65535 ) AS XXX FROM `hash` ORDER BY `XXX` ASC
    ```
    得出来的结果是__32765__一点也不科学!
    ZEOH
        3
    ZEOH  
       2018-06-22 09:38:15 +08:00   ❤️ 3
    1000000000000010D = 11100011010111111010100100110001101000000000001010B
    1111111111111111D = 11111100101000110010110111000101010111000111000111B
    异或运算结果:00011111111111001000010011110100111111000111001101B = 140677691470285D
    wwqgtxx
        4
    wwqgtxx  
       2018-06-22 09:40:26 +08:00
    一楼说的是你的 1000000000000010 不是二进制而是十进制。。。
    maichael
        5
    maichael  
       2018-06-22 09:41:43 +08:00
    结果是对的,只是以 10 进制的形式显示而已。
    90safe
        6
    90safe  
    OP
       2018-06-22 09:42:28 +08:00
    @ZEOH 3Q
    joyme
        7
    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
        8
    newtype0092  
       2018-06-22 09:44:59 +08:00
    select conv(conv(1000000000000010, 2, 10) ^ conv(1111111111111111, 2, 10), 10, 2);
    newtype0092
        9
    newtype0092  
       2018-06-22 09:45:23 +08:00
    二进制十进制转换链接一下
    90safe
        10
    90safe  
    OP
       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
        11
    90safe  
    OP
       2018-06-22 10:01:47 +08:00
    解决了,我也不知道为什么 hash 太长就会出现转换变 0,把 hash 砍成 4x16 段来比对就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1136 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.