目录
【异或运算介绍】
【异或的运算法则】
【交换两个变量的值】
【利用异或加密算法举例】
【用异或查找数组中只出现一次的数字】
【题目描述】【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& nums) {
int res=nums[0];
for(int i=1;i
撒花完结!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)