可以理解为一种模板,主要为了便于书写、阅读与理解;在嵌入式开发中常用,在涉及硬件操作的库中常见(C\C++)。比如,控制单片机 IO_P2 输出高,而不影响其它引脚位:unsigned int val = *(register_p2_addr); // 获取当前状态值 val = val | (1 << 2); // 仅修改对应第 2 位 *(register_p2_addr) = val; // 修改后的值写回 简写等价于 ==> *(register_p2_addr) |= (1 << 2); 从上可以看出,比自己手动计算,可以很容易的找到某一位,因此更容易书写与理解。甚至理解或封装成一种模板。void setPinHeight(int pin_num) { *(register_p2_addr) |= (1 << pin_num); }尤其底层硬件驱动程序开发时,官方数据手册中有无数无数无数个寄存器,上面的位操作是必须要使用的。厂商的官方驱动也采用这种方式。
算出来的想法是不可取,这需要编程人员做额外的运算,增加了编程的负担。之所以这么写,是因为移位运算对计算机来说算起来十分方便,可以迅速得到结果。从某种程度上讲,计算机做移位运算比做加减乘除快的多。所以这提高了编程效率。
比如,控制单片机 IO_P2 输出高,而不影响其它引脚位:
从上可以看出,比自己手动计算,
可以很容易的找到某一位
,因此更容易书写与理解。甚至理解或封装成一种模板。尤其底层硬件驱动程序开发时,官方数据手册中有无数无数无数个寄存器,上面的位操作是必须要使用的。厂商的官方驱动也采用这种方式。