C语言-位运算
位运算主要用于操纵硬件时使用,接近底层。
逻辑运算相当于把非零数当成1,然后做相应的位运算。
位运算符:
按位与 & : 全1为1,其它皆0。作用:让某些位为零 x & 0xFE ;取一个数的一段 x & 0xFF
按位或 | : 有1就1,全0才0。作用:让某些位为1 x | 0x01 ;把两个数拼起来 0x00FF | 0xFF00
按位取反 ~ : 1变0,0变1。(注意与补码不同)x & ~y (单片机SFR让某一位为0,对多位操作使用struct 及 : 【位段】)
按位异或 ^ : 不同为1,相同取0。(可以做简单弱加密运算)
移位运算,位数不要用负数!
左移 << n位 等价于放大2n 倍(int)【不管符号位】 1u << k
右移 >> 缩小,(int),对于unsigned:左边填入0;对于signed型:左边最高位保留
例子:
#include <stdio.h>
void prtBin(unsigned int number);
struct U0 {
//位段可以直接用位段的成员名访问,比 与、或、移位方便
//编译器排列位的次序,所以程序不具有可移植性
unsigned int leading: 3; //占3bit
unsigned int FLAG1: 1;
unsigned int FLAG2: 1;
int trailing: 27; //如果超过一个int,会采用多个int
};
int main() {
struct U0 uu;
uu.leading = 2;
uu.FLAG1 = 0;
uu.FLAG2 = 1;
uu.trailing = 0;
printf("sizeof(uu)=%lu\n", sizeof(uu));
prtBin(*(int*)&uu);
return 0;
}
void prtBin(unsigned int number) {
//输出二进制数,C语言没有直接输出二进制的格式
unsigned mask = 1u << 31;
for ( ; mask; mask >>= 1 ) {
printf("%d", (number & mask ? 1 : 0));
}
putchar(10);
}