多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
【33.1 “按位取反”运算。】 “按位取反”运算也是以位为单位进行运算的。位是指二进制中的某一位,位只能是0或者1。跟前面“加、减、乘、除、与、或、异或”有点不一样的地方是,“按位取反”的运算只有1个对象,它不像加法运算那样可以与其它第2个对象产生关系,比如“a加b”这里有2个对象a和b,而“a按位取反”只有1个对象a。一个数的“按位取反”运算就是把该数转换成二进制后对每一位的“取反”运算。 “按位取反”运算的符号是波浪符号“~”。运算规律是:针对一个数的“按位取反”,先将其展开成二进制的格式,然后每个位取反,所谓取反就是1的变成0,0的变成1。 现在举一个完整的例子来分析“~”运算的规律。有两个unsigned char类型的十进制数分别是5和0,求~5和~0的结果分别是多少?分析步骤如下: 第一步:先把参与运算的两个数以二进制的格式展开。十进制转二进制的方法请参考前面第14,15,16节的内容。 十进制5的二进制格式是: 00000101。 十进制0的二进制格式是: 00000000。 第二步:将它们二进制格式的每一位取反,1的变成0,0的变成1。 (a)对5的按位取反。 十进制的5 -> ~00000101 “按位取反”运算结果是 -> 11111010 (b)对0的按位取反。 十进制的0 -> ~00000000 “按位取反”运算结果是 -> 11111111 第三步: (a)把二进制的11111010转换成十六进制是:0xFA。转换成十进制是250。所以~5的结果是250。 (b)把二进制的11111111转换成十六进制是:0xFF。转换成十进制是255。所以~0的结果是255。 【33.2 “非”运算。】 注意,“非”运算不是以位为单位进行运算的。“非”跟“按位取反”有点相似,但是区别也明显。“按位取反”是以位为单位进行运算的,侧重在局部。而“非”是针对一个数的整体,侧重在全局。“非”只有两种状态“假”和“真”。0代表假,大于0的数值代表真,也可以说“非”假即真,“非”真即假。不是假的就是真的,不是真的就是假的。强调的是两种状态的切换。在数值表示上,用0代表假的状态,用1代表真的状态。“非”的对象也只有1个,它不像加法运算那样可以与其它第2个对象产生关系,比如“a加b”这里有2个对象a和b,而“a的非”只有1个对象a。 “非”运算的符号是感叹号“!”,注意输入这类运算符号的时候不能用汉字输入法,而是要切换到英文字符的输入法下再输入,否则编译不通过(其它运算符也一样,都要求在字符输入法下输入)。“非”运算的规律是:针对某个数的“非”,不管此数有多大,只要它大于0,那么被“非”后就一定是0。也不管此数是什么变量类型,只要它数值等于0,那么被“非”后就一定是1,而不是0xff或者0xffff之类。 现在举一个完整的例子来分析“!”运算的规律。有两个unsigned char类型的十进制数分别是5和0,求!5和!0的结果分别是多少?分析思路如下: (a)针对5的“非”运算。 5大于0,是一个整体,被“非”后为0. (b)针对0的“非”运算。 0就是0,是一个整体,被“非”后为1. 【33.3 例程练习和分析。】 现在编写一个程序来验证刚才讲到的“按位取反”和“非”运算: 程序代码如下: /\*---C语言学习区域的开始。-----------------------------------------------\*/ void main() //主函数 { unsigned char a=5; unsigned char b=5; unsigned char c=0; unsigned char d=0; a=~a; b=!b; c=~c; d=!d; View(a); //把第1个数a发送到电脑端的串口助手软件上观察。 View(b); //把第2个数b发送到电脑端的串口助手软件上观察。 View(c); //把第3个数c发送到电脑端的串口助手软件上观察。 View(d); //把第4个数d发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:250 十六进制:FA 二进制:11111010 第2个数 十进制:0 十六进制:0 二进制:0 第3个数 十进制:255 十六进制:FF 二进制:11111111 第4个数 十进制:1 十六进制:1 二进制:1 分析: 通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。 【33.4 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。