大二暑假,学习大一时快忘光的C语言(丢人!)
最近,学习C语言的运算符,看到了数电中的异或^,恰巧在verilog中也有异或源码的涉及,不过在Verilog中一般都用二进制表示数值,我想C语言应该可以直接用十进制,于是设计了一个程序
#include<stdio.h>
int main()
{
int a=3;
int b=4;
int c;
c=a^b;
printf("%d\n",c);
return 0;
}
结果为7
我一开始纳闷,为什么不是零(惭愧,没一下想出来)?
后来利用二进制想了一下,的确是7,原因是数值在编译系统内以二进制形式的补码存储。(以二进制表示:原码即最高位为符号位,其余位二进制表示十进制的数的绝对值;补码则是原码最高位不变,其余位取反加一;反码则是补码减一)
这就解释得通了:a=(0011)=3;b=(0100)=4;每位异或即得c=(0111)=7;
(异或:二级制范围,即只有0和1存在才能使用,相同为0,相异为1;同或,即异或非:即相同为1,相异为0)。
另外,在C语言中也可以用异或来交换数值。还是前面代码,改动少许:
#include<stdio.h>
int main()
{
int a=3;
int b=4;
a=a^b;
b=b^a;
a=a^b;
printf("a=%d\nb=%d\n",a,b);
return 0;
}
结果为:
a=4
b=3
在以上程序中,实际上b=b^(a ^b),a=a ^(b ^a)
根据异或的运算法则,
b=b^ (a^ b)=b ^b ^a=a;
a=a^ (b^ a)=a ^a ^b=b;
也就交换了顺序。
关于异或的内容,可以查找任何一本有关数电(数字逻辑与应用)的书,其中有详细讲解的。