【异或运算】【异或的运算性质】【用异或交换两个数字的值】【利用异或来加密算法】【用异或查找数组中只出现一次的数字LeetCode136】

目录

【异或运算介绍】

【异或的运算法则】

【交换两个变量的值】

【利用异或加密算法举例】

【用异或查找数组中只出现一次的数字】

【题目描述】【LeetCode136】

【思路】

【采用代码如下】


 【异或运算介绍】

        “异或”是一个逻辑运算符,异或的数学符号为“⊕”计算机符号为“xor”。与其他语言不同的一点是,C语言采用“^”表示异或符号C++既可以采用 xor,又可以采用 “^”其他语言的“^”一般表示乘方

        异或运算也叫半加运算,其运算法则相当于不带进位的二进制加法,所以异或运算经常被认为不进位加法

【异或的运算法则】

0 ⊕ 0 = 0,1 ⊕ 0 = 1,0 ⊕ 1 = 1,1 ⊕ 1 = 0(同为0,异为1)

(1)归零律:a ⊕ a = 0 ;

(2)恒等律:a ⊕ 0 = a ;

(3)交换律:a ⊕ b = b ⊕ a ;

(4)结合律:a ⊕ b ⊕ c = a ⊕ ( b ⊕ c ) = ( a ⊕ b ) ⊕ c ;

(5)自反性:a ⊕ b ⊕ a = a ;

【交换两个变量的值】

        交换两个变量的值通常用的方法是取中间变量,还可以利用异或仅使用两个变量进行交换。在进行异或运算的时候,首先将数值转换为二进制,对二进制的每一位,进行异或运算

void swap(int &a,int &b)
{
    a=a^b;
    b=b^a;
    a=a^b;
}  

可以得到:(a^b)^b=a

应用:可以用于加密算法某一环节或更多环节,易于实现,计算成本小。

 【利用异或加密算法举例】

        已知加密的内容为A,密钥为B,则可以用异或加密:C=A^B在数据中保存C就可以了;如果想解密的话,则:A=C^B,只要知道密钥,即可完成解密。对于字符串的异或,就是对每一个字符进行二进制异或运算。

        简单重复异或加密有时用于不需要特别安全的情况下来隐藏信息,如果使用不断重复的密钥,利用频率分析就可以破解这种简单的异或密码。如果密钥是随机的(不重复的),异或密码就更为安全;如果密钥是真正随机的,结果就是一次性密码本,这种密码在理论上是不可破解的。

【用异或查找数组中只出现一次的数字】

【题目描述】【LeetCode136】

        给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

【思路】

        根据(a^b)^b=a,利用for循环,将nums[0]当做 b ,逐个进行异或操作,则 a 就是那个只出现一次的数字。

【采用代码如下】

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res=nums[0];
        for(int i=1;i<nums.size();i++)
            res^=nums[i];
        return res;
    }
};

撒花完结!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值