C语言异或^的释疑(3^4=7)

大二暑假,学习大一时快忘光的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;
也就交换了顺序。
关于异或的内容,可以查找任何一本有关数电(数字逻辑与应用)的书,其中有详细讲解的。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值