查看: 1682|回复: 0
打印 上一主题 下一主题

逻辑运算符的“按位取反”和“非”。

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-24 08:12:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
逻辑运算符的“按位取反”和“非”。
       “按位取反”运算的符号是波浪符号“~”。运算规律是:针对某个数的“按位取反”,先将其展开成二进制的格式,然后每个位取反,所谓取反就是1的变成0,0的变成1。
        现在举一个完整的例子来分析“按位取反”运算的规律。有一个unsigned char类型的十进制数分别是5和0,求~5和~0的结果是多少?分析步骤如下:
        第一步:先把参与运算的数转换成二进制的格式。十进制转二进制的方法请参考前面第13,14,15节的内容。
十进制5的二进制格式是:00000101。
十进制0的二进制格式是:00000000。
       第二步:
(1)将5的二进制数每一位取反,1的变成0,0的变成1。
        ~00000101
结果是 11111010。
把二进制的11111010转换成十六进制是:0xFA。转换成十进制是250。所以~5的结果是250。
(2)将0的二进制数每一位取反,1的变成0,0的变成1。
        ~00000000
结果是 11111111。
把二进制的11111111转换成十六进制是:0xFF。转换成十进制是255。所以~0的结果是255。
      讲完“按位取反”,现在接着讲“非”。 “非”跟“按位取反”有点相似,但是区别也明显。“按位取反”针对的是一个数的某一位,侧重在局部。而“非”是针对一个数的整体,侧重在全局。“非”只有两种状态“假”和“真”。0代表假,大于0的数值代表真,也可以说“非”假即真,“非”真即假。不是假的就是真的,不是真的就是假的。强调的是两种状态的切换。在数值表示上,用0代表假的状态,用1代表真的状态。
      “非”运算的符号是感叹号“!”。运算规律是:针对某个数的“非”,不管此数有多大,只要它大于0,那么被“非”后就一定是0。也不管此数是什么变量类型,只要它数值等于0,那么被“非”后就一定是1。
      现在举一个完整的例子来分析“非”运算的规律。有一个unsigned char类型的十进制数分别是5和0,求!5和!0的结果是多少?分析步骤如下:
      第一步:5大于0,是一个整体,被“非”后为0.
      第二步:0就是0,是一个整体,被“非”后为1.

     现在编写一个程序来练习刚才讲到的内容,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/


  unsigned char a=5;
  unsigned char b=5;
  unsigned char c=0;
  unsigned char d=0;

  a=~a;
  b=!b;


  c=~c;
  d=!d;

  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把a这个变量放到窗口变量1里面显示
  GuiWdData2=c;   //把a这个变量放到窗口变量2里面显示
  GuiWdData3=d;   //把a这个变量放到窗口变量3里面显示   


/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
                  initial();
      key_service();
      display_service();
   }

}
复制代码

       查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
      变量a为250(十六进制是0xFA,二进制是11111010)。
      变量b为0  (十六进制是0x00,二进制是00000000)。
      变量c为255(十六进制是0xFF,二进制是11111111)。
      变量d为1  (十六进制是0x01,二进制是00000001)。
     下节预告:移位运算的左移。转载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表