• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

问个单片机C语言的问题

在书上看到这么一条测试语句

while((a^0x080)!=0)

我看它的意思是测试一下a与0x080是否相等再执行循环语句的,
为什么不用下面这个更直接的语句呢

while(a!=0x080)
全部回复(6)
正序查看
倒序查看
george_20
LV.3
2
2007-07-31 07:12
上面的是测试a的最高位是否置1,不是把a看作一个整体,是把a看作8个标志位的集合,下面的是将a看作一个整体.如果a=0x00,上式为假,下式为真.
0
回复
2007-07-31 09:52
@george_20
上面的是测试a的最高位是否置1,不是把a看作一个整体,是把a看作8个标志位的集合,下面的是将a看作一个整体.如果a=0x00,上式为假,下式为真.
有点明白,谢谢
0
回复
whatcall
LV.5
4
2007-08-01 21:11
@george_20
上面的是测试a的最高位是否置1,不是把a看作一个整体,是把a看作8个标志位的集合,下面的是将a看作一个整体.如果a=0x00,上式为假,下式为真.
2楼的不正确.
(^)是按位“异或”运算符,大家知道二进制异或运算时任意数(0或1)和1异或结果取反,和0异或则保持不变, a^0x080 的结果是将a的由低(起始位1)到高第8位取反,其他位不变.为什么要这样做? 我猜想因为这一位标志的逻辑与其他7为可能是相反的.即假设其他7位是0表示正常,而第8位是为1时表示正常.因此
(a^0x080) != 0可一次判断所有标志是否正常.

(a&0x080) != 0 才是屏蔽其他位测试第8位是否为零.
当然与(a!=0x080)更是截然不同.
说到底不过是数学运算和位逻辑运算的基础知识,使用的多了就比较容易看出来.

不对之处,请指教.
0
回复
2007-08-28 17:20
@whatcall
2楼的不正确.(^)是按位“异或”运算符,大家知道二进制异或运算时任意数(0或1)和1异或结果取反,和0异或则保持不变,a^0x080的结果是将a的由低(起始位1)到高第8位取反,其他位不变.为什么要这样做?我猜想因为这一位标志的逻辑与其他7为可能是相反的.即假设其他7位是0表示正常,而第8位是为1时表示正常.因此(a^0x080)!=0可一次判断所有标志是否正常.(a&0x080)!=0才是屏蔽其他位测试第8位是否为零.当然与(a!=0x080)更是截然不同.说到底不过是数学运算和位逻辑运算的基础知识,使用的多了就比较容易看出来.不对之处,请指教.
我比较赞同2楼的看法,因为进行异或运算时,两操作数相同时结果为0,不同时结果为1,比如说1^1=0,0^0=0,1^0=1,0^1=1,和你说的“(a&0x080) != 0 才是屏蔽其他位测试第8位是否为零”功能差不多,但是这里它没有起到屏蔽低7位的作用,而用与运算起到了屏蔽低7位的作用,如有不对之处请指正
0
回复
2007-08-28 17:23
@whatcall
2楼的不正确.(^)是按位“异或”运算符,大家知道二进制异或运算时任意数(0或1)和1异或结果取反,和0异或则保持不变,a^0x080的结果是将a的由低(起始位1)到高第8位取反,其他位不变.为什么要这样做?我猜想因为这一位标志的逻辑与其他7为可能是相反的.即假设其他7位是0表示正常,而第8位是为1时表示正常.因此(a^0x080)!=0可一次判断所有标志是否正常.(a&0x080)!=0才是屏蔽其他位测试第8位是否为零.当然与(a!=0x080)更是截然不同.说到底不过是数学运算和位逻辑运算的基础知识,使用的多了就比较容易看出来.不对之处,请指教.
补充一点,应该是判断a是不是等于80H,应该说还是楼主的理解比较好,其功能不是判断最高位是否为1
0
回复
2007-08-31 11:58
楼主只拿这一条语句出来,容易误导人.应该根据具体的实现功能来判断.不要老拿着c语言的思想思考问题.4楼说的也有道理,不过谁知道他while循环里边是什么呢??上边可以用pic的汇编来写:
btfss a_1,7
goto  while_loop1
goto  next_prog1
;-----------------

movlw 0x80
xorwf a,0
btfss 0x03,2
goto  while_loop
goto  next_prog
同样一句c语言,理解不同,实现功能和效率明显不同.你想让编译器怎么优化呢?
0
回复