首页 > 编程知识 正文

如何按位异或(c语言按位取反运算符)

时间:2023-05-04 04:13:53 阅读:1457 作者:2176

运算中涉及的两个值,如果对应的两位相同,结果为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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。