"); //-->
有半个多月没更新笔记了,广告少,动力也明显不足了,挺安逸的,毕竟最近鱼鹰也有其它事情要忙,主业要紧。在此感谢大家的继续关注!
今天继续更新一篇小短文,希望对你有帮助。
int func(int temp)
{
return !!temp;
}不知道你是否看过上面类似的代码,两个感叹号出现在代码中,难道代码也有思想,也需要表达情感吗?
刚学习 C语言的时候,你应该经常看到过 1 个感叹号的情况,比如:
if(one != two)
{
.......
}
-----------------------------------------
if(!temp)
{
......
}
-----------------------------------
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
-----------------------------------------
one = !temp;但两个感叹号估计就很难见到了。
鱼鹰大学四年、工作三年都没见过这种写法,直到前段时间看 Linux 源码,才接触到,第一次看到时非常惊讶,怎么还有这种写法?
为什么要用两个感叹号,作用是什么,只是为了表现 C 语言的奇技淫巧吗?
仔细想过后才惊叹其中的巧妙。
假设一个字节变量 byte,可代表范围 0~255,0 代表其中一种含义,1 ~255 代表另一种含义(你可能会问,怎么不直接用 0 和 1 表示,因为这个变量本身不只有 0 和 1,只是在另一个使用的地方才会只使用二值含义,总之会有这种情况)。
如果我要用另一个变量 bit 来表示这两种含义,一般情况我们会这么做:
int func(unsigned char byte)
{
unsigned char bit;
if(byte == 0) {
bit = 0;
}
else{
bit = 1;
}
return bit;
}更优雅简单一点是这样写:
int func(unsigned char byte)
{
bit = byte ? 1 : 0;
return bit;
}但不管哪一个,都不如第一个简单高效。
简单可以很容易看出来,高效何在?
它不需要判断语句(判断语句在单片机中可能影响不是很大,但在有多级缓存的情况下,影响可能很大,这就是为什么 linux 中用 likely() 之类的进行优化)。
这样,不管原先的 byte 是什么值,都将变成 0 或 1。
这样一来,如果调用者使用如下方式:
if(func() == 1)
{
}
或者
if(func())
{
}都不会出现问题。
对于负数也是如此,只要是为了把 0 单独分开,都可以采用这种方式。
这在底层开发中也非常实用。
比如 GPIO 有个引脚号需要判断是 0 或 1,一般这样:
bit = (GPIOB->IDR & GPIO_Pin_4) >> 4;
或者
bit = (GPIOB->IDR & GPIO_Pin_4) ? 1 : 0;
上一种确实也是不错的选择,但是这里需要修改两个地方,修改时很容易遗忘,所以不如下面这种简单:
bit = !!(GPIOB->IDR & GPIO_Pin_4);
如果换个 IO ,需要修改代码时,只要修改一次就搞定,相当方便,所以建议大家使用上面那种方式获取位的值。
而从汇编的角度来看,两次 ! 也只需要一条指令搞定:

效率不输移位方式!
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
MSP430x2xx4xx系列
车规级MCU介绍
瑞萨RA0单片机连载——PWM实现呼吸灯
单片机语言C51应用实战集锦
《ATmega8原理及应用手册》
用单片机制作的纯正弦波逆变电源电路
《AVR单片机C语言库》
新手必看的单片机知识
介绍采用 nanoWatt XLP技术的超低功耗系列单片机
AVR 单片机专栏,资料下载!之二
倾情奉献:MSP430汇编指令集(中文),详解带实例!
用AT89C2051单片机实验合弦乐
Microchip发布PIC16F17576单片机(MCU)系列,简化模拟传感器设计
利用PIC12C508单片机来实现加密狗技术[转帖]
MSP430 电表解决方案
MSP430单片机TIMER_A在产品设计中的应用
双芯智控革命:IGBT与单片机如何重塑智能微波炉
AVR 单片机专栏,资料下载!
GD32E230F6V6实用指南:为下一个项目选择合适单片机
功率监测与控制系统DIY——搭建环境,定时器翻转LED
瑞萨单片机技术概述
瑞萨RA0单片机连载——面向对象编程之SHT31温度计
Microchip推出集成高性能模拟外设的32位PIC32A单片机
创维数码5000系列彩电开关电源(AN单片机)电路
长虹R2118A型彩电开关电源(LA单片机)电路
5V 单片机与5V 耐压单片机有何区别,为什么至关重要
超低功率高性能新一代产品MSP430F5xx
16位语言函数工具库
语音合成芯片T6668和单片机8031的接口电路图
[转帖]从Cygnal C8051F看8位单片机发展之路