当前位置:  开发笔记 > 人工智能 > 正文

如何使用+ - */实现XOR?

如何解决《如何使用+-*/实现XOR?》经验,为你挑选了3个好方法。

如何仅使用基本算术运算来实现XOR运算(在两个32位整数上)?按顺序除以2的每个幂后,是否必须按位进行,或者是否有快捷方式?关于最简单,最短的代码,我并不关心执行速度.

编辑: 这不是家庭作业,而是hacker.org上的谜语.重点是在基于堆栈的虚拟机上实现XOR,操作非常有限(类似于brainfuck语言,是 - 没有shift或mod).使用该VM是困难的部分,尽管通过简短的算法当然更容易.

虽然FryGuy的解决方案很聪明,但我必须采用我原来的理想(类似于litb的解决方案),因为在这种环境中难以使用比较.



1> FryGuy..:

我会这么做的简单方法:

uint xor(uint a, uint b):    

uint ret = 0;
uint fact = 0x80000000;
while (fact > 0)
{
    if ((a >= fact || b >= fact) && (a < fact || b < fact))
        ret += fact;

    if (a >= fact)
        a -= fact;
    if (b >= fact)
        b -= fact;

    fact /= 2;
}
return ret;

可能有一种更简单的方法,但我不知道.



2> benjismith..:

我不知道这是否会破坏你的问题,但你可以使用AND,OR和NOT实现XOR,如下所示:

uint xor(uint a, uint b) {
   return (a | b) & ~(a & b);
}

在英语中,这是"a或b,但不是a和b",它精确地映射到XOR的定义.

当然,我并没有严格遵守你只使用算术运算符的规定,但至少这是一个简单易懂的重新实现.



3> Johannes Sch..:

对不起,我只知道头脑中直截了当的人:

uint32_t mod_op(uint32_t a, uint32_t b) {
    uint32_t int_div = a / b;
    return a - (b * int_div);
}

uint32_t xor_op(uint32_t a, uint32_t b) {
    uint32_t n = 1u;
    uint32_t result = 0u;
    while(a != 0 || b != 0) {
        // or just: result += n * mod_op(a - b, 2);
        if(mod_op(a, 2) != mod_op(b, 2)) {
            result += n;
        }
        a /= 2;
        b /= 2;
        n *= 2;
    }
    return result;
}

可以使用注释中的替代方法而不是if来避免分支.但话说回来,解决方案也不是很快,它让它看起来很奇怪:)

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有