运算中涉及的两个值,如果对应的两位相同,结果为0,否则为1。
即:
0^0=0,
1^0=1,
0^1=1,
1^1=0
按位异或:的三个特征
(1) 0 0=0,0 1=1 0异或任意数=任意数。
(2) 1 0=1,1 1=0 1异或任意数——任意数的倒数。
(3)将自己与任意数字异或=将自己设置为0。
按位异或:的几种常见用法
(1)翻转一些特定的位
例如,如果对数10100001的第二位和第三位颠倒,则该数可以与00000110按位异或。
10100001^00000110=10100111
(2)不使用临时变量,实现两个值的交换。
例如,交换两个整数a=10100001和b=00000110的值可以通过以下语句实现:
a=a^b;//a=10100111
b=b^a;//b=10100001
a=a^b;//a=00000110
(3)在汇编语言中常用于将变量设置为零:
异或a,a
(4)快速判断两个值是否相等。
比如1:判断两个整数A和B是否相等,可以通过以下语句实现:
返回((a ^ b)=0)
示例2:最初的ipv6_addr_equal()函数在Linux中的实现如下。
静态内联int IPv6 _ addr _ equal(const struct in 6 _ addr * a1,const struct in6_addr *a2)
{
返回(a1-S6 _ addr 32[0]==a2-S6 _ addr 32[0]
a1-S6 _ addr 32[1]==a2-S6 _ addr 32[1]
a1-S6 _ addr 32[2]==a2-S6 _ addr 32[2]
a1-S6 _ addr 32[3]==a2-S6 _ addr 32[3]);
}
使用按位异或可以实现快速比较,最新实现修改为:
静态内联int IPv6 _ addr _ equal(const struct in 6 _ addr * a1,const struct in6_addr *a2)
{
返回(((a1-S6 _ addr 32[0]^ a2-S6 _ addr 32[0])|
(a1-S6 _ addr 32[1]^ a2-S6 _ addr 32[1])|
(a1-S6 _ addr 32[2]^ a2-S6 _ addr 32[2])|
(a1-S6 _ addr 32[3]^ a2-S6 _ addr 32[3])==0);
}
5应用通式:
对两个表达式执行按位异或运算。
结果=表达式1 ^表达式2
参数
结果
任何变量。
表达式1
任何表情。
表达式2
任何表情。
解释
运算符查看两个表达式的二进制表示的值,并执行按位异或运算。该操作的结果如下:
001(表达式1) 1100(表达式2)-1001(结果)当且仅当表达式的某一位为1时,结果的该位为1。否则,结果的该位为0。
只能用于整数
以下程序使用按位异或运算符:
E级
{公共静态void main(String args[ ])
{
Char a1='十',a2='点',a3='前进',a4='攻击';
char secret=' 8
a1=(char)(a1^secret);
a2=(char)(a2^secret);
a3=(查尔)(a3^secret);
a4=(char)(a4^secret);
System.out.println('密文: ' a1 a2 a3 a4);
a1=(char)(a1^secret);
a2=(char)(a2^secret);
a3=(查尔)(a3^secret);
a4=(char)(a4^secret);
system . out . println(' original : ' a1 a2 a3 a4);
}
}
这只是加密和解密
字符型,也就是字符型,其实就是整形,也就是数字。
计算机中的所有信息都是整数,所有整数都可以用二进制表示。实际上,计算机只知道二进制。
位操作是二进制整数操作。
两个数字的按位异或意味着从一位开始的逐位比率。
如果两个数对应的位相同,结果为0,差为1。
所以111 101=010
加密的过程是将秘密字符逐个异或。
解密的过程是密文与同一字符进行异或运算。
010^101=111
至于密文为什么又被XOR改成了原文,我们稍微想一想就知道了。
来源:https://www . cn blogs.com/this-543273659/archive/2011/08/30/2159819 . html