Andrew Huang
位操作是一个嵌入式C开发者需要掌握基本功之一.在寄存器,标志位操作等都需要大量位操作.
1.逻辑位操作
数C语言有几个标准的位操作符.(注意跟逻辑连接符 && || !区分开来)
| 位或
& 位与
~ 位取反
^ 位异或.
这几个操作符也能与=结果成复合操作符 |=,&=,~=,^=.
1.1 ~取反操作
单目操作符.后面接一个整数类型.
格式: ~
给任何一个类型,按位取反.因此一个负数取反必须是一个正数.
简单判断一个数是否带符号位办法
#define IS_SIGNED(n) ( (((n)>=0) && (~(n)<0)) || (((n)<0) && (~(n)>0)) )
这个宏就是利用补码取反符号位也改变特性
简单判断一个类型是否带符号位的办法
#defineISUNSIGNED(type)(~((type)1)>0)
思考:能对浮点数double进行取反吗?后果是什么?
产生编译错误,无法对应作取反操作
1.2 |位或
双目操作符,格式: 数字 | 数字
两个数字按位操作,每一个对应位只要出现1,结果必然是1,只有对应位上全0,结果为0,即满足如下运算
1 | 0 = 1 ; 0 | 1 = 1 ; 1 | 1 = 1 ; 0 | 0 = 0
#define PRINT_INT(e) printf("%s=%d\n",#e, e)
PRINT_INT(7 | 3 );
PRINT_IN