算术操作运算

  • 数学加减乘除等
  • * 乘法/指针定义,运算符要看场景

+ - 加减

A+B = C //尽量类型一致

* / 乘除

大多数处理器不支持,导致效率低,可移植性变差,少用

int a = b*10; //CPU可能多周期,甚至利用软件模拟实现乘法
int a = b+10; //CPU一个周期可以处理

% 求模 余数

0%3=0    1%3=1    2%3=2
  • 得出的值位于两数之间
  • a%b=c ==> c在(0-(b-1))之间

eg: 给定任意数,取一个范围的数 (m%100)+1 ==> res

得到M进制的一个个位数 如30的3进制个位数是 30%3=0

循环数据结构的下标

逻辑运算

真假 返回结果1/0 一般认为非0就是真

|| 与 && 或

A || B === B || A  //不成立
//如A为假则 A||B 就为假,不必判断B的真假,其余同理
A && B

> >= < <=

没啥可讲的

! 取反

对比位运算取反操作

int a = 0x0;

!a if(!a){} //0 ==> 1

~a //内存空间全为1 0 ==>0x11111111

? :

位运算

« 左移 » 右移

嵌入式中应用最广泛 硬件最小处理单位-比特 软件无法直接定义比特,借助位运算操作

左移

当作乘法 二进制下的位移 M«1 ==> M *2 4: 00100 8: 01000 M « n ==> M*2*n

int a = b*32  ==> b<<5

注意符号问题,符号无关

-1 8bit表示 10000001 补码:符号位不变,其他位取反 11111110 内存中:补码加一 11111111

-2 10000010 补码 11111101 内存 11111110

左移右面默认补0

右移

符号变量有关 int a; a»n unsigned a; a»n 不一样

右移左面负数默认补1 正数默认补0

& | ^ 与或非

& 与 清零器 clear

A&0 =>0

屏蔽 取出

//屏蔽低八,取出高八
int a = 0x1234
a & 0xff00;
//清除第五位
a = a & 011111;
a = a & ~(0x1<<5);

| 或 设置器 set

A | 1 => 1 A | 0 => A

保留

设置为高电平

//设置一个资源bit5为高,其他不变
a = a | 0x100000
a = a | (0x1<<5)

^ ~

^ 异或

常用在算法里,加密解密,函数设计,而工程中用的少

//交换两个数,不引入第三个数
int a = 20;
int b = 30;
a = a^b;
b = a^b;
a = a^b;

~ 取反

32位情况下 ~0xf0 = 0xffff ff0f

区别于!,!结果只有1/0

赋值运算

=

前面所有符号不具有更新能力,不能赋值

+= -= &= …

a+=b;//等同下
a = a+b;
a = a & ~(0x1<<5);//同下
a&=~(0x1<<5);

内存访问符号

()

限制符

a = (a+b)*c

函数访问符号

int fun();
fun();//访问

[] 数组

内存访问 ID(标签)符号

a[1]
a[2]

函数体限制符

-> .

->

地址访问

.

变量访问

& *

&

取地址

&abc

位运算

&0x10

*

指针

*p

乘法

2*3