逻辑代数原理及其应用

美妙的数学定理,总会找到其用武之地,亦非常美妙。

a0=ab0=b(ab)c=a(bc)(ab)b=a(bb)=a0=a(ab)a=a(ab)=(aa)b=0b=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
}

异或运算:简单加密算法

直接用到的公式为:

(ab)b=a0=a

用密码学的术语说来就是,原文为 a ,密钥为 b ab 实现对原文的加密,采用类似对称加密的思路,仍然使用密钥 b 进行解密,(ab)b=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] 异或密码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值