C语言中 为什么 a^(b^a) = b

C语言中 为什么 a^(b^a) = b
a^(b^a) 展开是什么样子的

阅读 3k
4 个回答

不光 C,支持位运算的语言结果都会是这样(可能运算符不是这个,但结果相同)。

^ 是 XOR(异或)运算符,就是二进制逐位比较,如果某位相同、则记为 0,反之不同则记为 1。

举个简单的例子:

a = 1000 # 就4位吧,懒得打那么长
b = 1111

t1 = b ^ a = 0111 # 第1位相同,就是0;其他位都不同,结果就是1
t2 = a & t1 = 1111 # 每位都不同,结果都是1

P.S. 其实就是翻转再翻转。

a异或b,所有不同的位都是1。而不同的位只能是0-1和1-0导致的,那么再去异或a,0的位置因为0^1翻转为0,1的位置1^1翻转成0,正好就是b了

异或操作符
a = 5 = 101b
b = 3 = 11b

b^a = 110b
110b^a = 101b = 5

公式是这样的,利用了位的特性

刚刚正好复习这个,琢磨了一个,放出来一个有意思的例子(也就是楼主心中展开的样子),希望可以帮到楼主和遇到这个问题的其他同学

int main()
{
    char a[30] = { "abcd" };
    for (int i = 0; i < 4; i++)
    {
        a[i] = a[i] ^ 8;
        

    }
    for (int i = 0; i < 4; i++)
    {
        a[i] = a[i] ^ 8;
        

    }
    return 0;
}

和你的描述相似,先拿a和b异或(括号里优先计算),这时候得出了一个“加密的结果”,第一次循环,我们可以看到局部变量a变成了i字符
图片.png
循环加密四次后
图片.png
我们发现abcd已经全部变化

好了,我们现在进入第二个for循环,再次异或(解密)
图片.png

这时候,abcd已经全部“解密成功”。
因此,a^(b^a) = b就是加密到解密的过程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题