嵌入式系统学习Day16(C语言中的位运算)

位运算

二进制位的运算

嵌入式:

通过位运算 控制 硬件

运算:

运算规则

& 与 一假则假

| 或 一真则真

~ 非 真假相对

^ 异或 相同为假 不同为真

<< 左移 表示二进制位的移动

>> 右移

eg:

int a = 0x55;

int b = 0x33;

0101 0101 //0x55

&0011 0011 //0x33


0001 0001 //0x11

a & b =>

int a = 0x55;

int b = 0x33;

0101 0101 //0x55

|0011 0011 //0x33


0111 0111 //0x77

a | b =>

取反:

int a = 0x55;

~a

0101 0101 //0x55

1010 1010 //0xaa

用途:

控制二进制 -- 进而控制硬件

微控制器:

寄存器

写程序 --- 控制 --- 寄存器的 -- 二进制位

C 控制硬件

51

stm32

arm系列CPU

与 运算 --- 清零

或 运算 --- 置1

int a = 0x55;

0101 0101 //0x55

1111 1110


0101 0100 //清零

取反运算

0101 0101 //0x55

~1

1111 1110

<<

eg:

a<<n

表示,将数值 a 左移 n位

int a = 1;

3210

0000 0001 //1 0

0000 0010 //2 1

0000 0100 //4 2

0000 1000 //8 3

左移,每左移一位 相当于 乘以 2

1 << 1

取反运算

0101 0101 //0x55

1<<4

1

~1

1110 1111

0101 0101 //0x55


0100 0101 // 0101 0101 //0x55

4 5

int a = 0x55;

a & ~(1<<4)

置1

int a = 0x55;

0101 0101 //0x55

| 1<<n


0101 0111 //0x57

^ 异或 相同为假 不同为真

//加密

int a = 0x35;

0011 0101 //0x35

^0000 0110 //0x6


0011 0011 //0x33

0000 0110 //0x6


0011 0101 //0x35

实现两个数交换

int t = a;

a = b;

b = t;

//不使用第三方变量 实现两数交换

a = a + b;

b = a - b;

a = a - b;

a = a ^ b;

b = a ^ b;

a = a ^ b;

a 0011 0101 //0x35

b ^0000 0110 //0x6


0011 0011 //0x33 //a

0000 0110 //0x6 //b


0011 0101 //0x35 //原来的 a

0011 0011 //0x33


0000 0110 //0x6

注意:

1.浮点数 不能做位运算

>>

右移

a>>n //将a向右移动n位

0000 1000 // 8

0000 100 0

最高位 补什么

逻辑右移 区别在于看要移动数据是否有符号 ---默认最高位 补0

算术右移 //有符号 --- 最高位 补 符号位

0000 1000 //8 //右移 相当于除以 2

0000 0100 //4

0000 0010 //2

0000 0001 //1