下面举例说明∧运算符的应用:
(1)使特定位翻转
假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,即
结果值的低4位正好是原数低4位的翻转。要使哪几位翻转就将与其∧运算的该几位置为1即可。这是因为原数中值为1的位与1进行∧运算得0,原数中的位值0与1进行∧运算的结果得1。
(2)与0相∧,保留原值
如012∧00=012
因为原数中的1与0进行∧运算得1,0∧0得0,故保留原数。
(3)交换两个值,不用临时变量
假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
可以用下面的竖式来说明:
即等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。而b∧a∧b等于a∧b∧b。b∧b的结果为0,因为同一个数与本身相∧,结果必为0。因此b的值等于a∧0,即a,其值为3。
② 再执行第三个赋值语句:a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
a得到b原来的值。
在【二进制值运算】中:不同为1,相同为0,如1001异或1010等于0011。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。
这样2个变量中的值就实现了交换。那能不能不引入其他变量就可以实现变量值的交换呢?答案是肯定的。用异或操作可以实现,有2种实现方法,本质上是一样的。法1:#include int main(){int a,b;while(1){scanf("%d %d",...
如果想要交换2个变量,一般的做法是引入第三个变量,
例如,
temp = a;
a = b;
b= temp;
这样2个变量中的值就实现了交换。那能不能不引入其他变量就可以实现变量值的交换呢?答案是肯定的。
用异或操作可以实现,有2种实现方法,本质上是一样的。
法1:
#include
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
a = a^b; //(1)
b = a^b; //(2)
a = a^b; //(3)
printf("%d %d\n",a,b);
}
return 0;
}
法2:
#include
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
b = a^b;//(1)
a = a^b;//(2)
b = a^b;//(3)
printf("%d %d\n",a,b);
}
return 0;
}
因为2种方法本质一样,就方法一进行一下证明。
异或操作满足结合律和交换律,且由异或操作的性质知道,对于任意一个整数a^a=0;
证:(第(2)步中的a) a = a^b = (将第(1)步中的b代入b) a^(a^b) = b;
(第(3)步中的b)b = a^b = (将第(1)步中的b代入b,将第(2)步中的a代入a) a^b^a^a^b = a^a^a^b^b = a;
证毕
C语言BCC异或效验 uint8_t getbcc(uint8_t* data, uint16_t length) {	uint8_t bcc=0x00;	for (uint16_t i = 0;i