在书上看到这么一条测试语句
while((a^0x080)!=0)
我看它的意思是测试一下a与0x080是否相等再执行循环语句的,
为什么不用下面这个更直接的语句呢
while(a!=0x080)
问个单片机C语言的问题
全部回复(6)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
@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或1)和1异或结果取反,和0异或则保持不变, a^0x080 的结果是将a的由低(起始位1)到高第8位取反,其他位不变.为什么要这样做? 我猜想因为这一位标志的逻辑与其他7为可能是相反的.即假设其他7位是0表示正常,而第8位是为1时表示正常.因此
(a^0x080) != 0可一次判断所有标志是否正常.
(a&0x080) != 0 才是屏蔽其他位测试第8位是否为零.
当然与(a!=0x080)更是截然不同.
说到底不过是数学运算和位逻辑运算的基础知识,使用的多了就比较容易看出来.
不对之处,请指教.
0
回复
提示
@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
回复
提示
@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
回复
提示