美妙的数学定理,总会找到其用武之地,亦非常美妙。
a⊕0=ab⊕0=b(a⊕b)⊕c=a⊕(b⊕c)(a⊕b)⊗b=a⊕(b⊕b)=a⊕0=a(a⊕b)⊕a=a⊕(a⊕b)=(a⊕a)⊕b=0⊕b=b
以上等式的成立,暗含着异或运算满足交换律和结合律。
⊕
:表示逻辑代数中的异或操作,
^:C 语言中的异或操作;
异或运算:完成两数的交换
我们知道无论是传引用还是传地址,在 C 语言中要交换两个变量的值都要用到第三个变量来临时寄存数值,然而神奇的异或操作却可以在不声明第三个变量的情况下完成数值交换。
void swap(int* pa, int* pb)
{
*pa = *pa ^ *pb;
*pb = *pa ^ *pb;
// (*pa^*pb)^(*pb) = *pa
*pa = *pa ^ *pb;
// (*pa^*pb)^*pa = *pb
}
异或运算:简单加密算法
直接用到的公式为:
(a⊕b)⊕b=a⊕0=a
用密码学的术语说来就是,原文为
a
,密钥为
std::vector<int> operator^(std::vector<int>& v1, std::vector<int>& v2)
{
assert(v1.size() == v2.size());
std::vector<int> v(v1.size());
for (size_t i = 0; i < v1.size(); ++i)
v[i] = v1[i]^v2[i];
return v;
}
std::vector<int> cliper = {87, 105, 107, 105}, key = {243, 243, 243, 243};
for (auto elem: cliper^key)
std::cout << elem << " ";
std::cout << std::endl;
// 这是加密,加密得到的密文
for (auto elem: (cliper^key)^key)
std::cout << elem << " ";
std::cout << std::endl;
// 这是对称解密
References
[1] C语言中的位操作符
[2] 异或密码