引用特性:1.引用在定义时必须初始化 2.一个变量可以有多个引用 3.同一个引用不能给多个变量
传引用调用不会拷贝实参,效率更高
指在同一个作用域中可以有多个同名函数,函数名称相同,参数列表不同
参数列表不同:参数的数量、类型或顺序至少有一个不同。函数返回类型不影响函数重载
1.用要转换的10进制数除以2,得到商和余数
2.再将商除以2,又得到一个商和余数
3.重复上述步骤,直到商为0为止
4.最后将每次得到的余数从下往上排列,就是对应的2进制数
例如,将10进制数25转换为2进制数:
25/2=12......1
12/2=6......0
6/2=3......0
3/2=1......1
1/2=0......1
得到的2进制数为11001
1. 8进制数字每一位是0~7的数字,转换为2进制位最多有3个
2进制转8进制数时,从2进制序列右边低位开始,每3个2进制位换算成一个8进制位,剩余不够3个2进制位的直接换算
例如,2进制的01101011换算成8进制:0153(0开头的数字为8进制)
2. 16进制数字每一位是0~9,a~f的数字,转换为2进制位最多有4个
2进制转16进制数时,从2进制序列右边低位开始,每4个2进制位换算成一个16进制位,剩余不够4个2进制位的直接换算
例如,2进制的01101011换算成16进制:0x6b(0x开头的数字为16进制)
所以偶数的2进制表示,最低位一定是0;所以奇数的2进制表示,最低位一定是1
将一个数和1进行按位与运算,可以判断这个数的奇偶
背景:需要将一个数2进制中取出某一位或几位,让取出的位置上保留原来的值,其他位置为0
方法:使用一个值a,让a的二进制中对应位为1,其他位为0.再让这两个数按位与即可
适用场景:
权限管理中,系统通常用一个整数的不同2进制位表示不同的权限,如:
0位:读权限,1表示有读权限,0表示没有读权限
1位:写权限,1表示有写权限,0表示没有写权限
2位:执行权限,1表示有写权限,0表示没有写权限
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
执行 | 写 | 读 |
我们可以通过保留指定位,来检查某个权限是否被设置
背景:需要获取一个数2进制位中第 i 位(从右到左,从低到高,最低位为0位)
方法:对该数a进行:(a >> i)&1,结果为0,表示 i 位为0;结果为1,表示 i 位为1
适用场景:
在嵌入式系统,某些寄存器包含多个信息字段,这些字段往往在寄存器的特定位中,需要获取指定位来读取
背景:需要将一个数二进制表示中某一位或几位设置为1/0,其余位保留原值
设置为1:用一个数a,让a对应2进制位上为1,其余位为0,然后进行按位或运算
设置为0,用一个数a,让a对应2进制为上为1,,其余位为0对a取反,再进行按位与运算
适用场景:
嵌入式系统,我们要控制某个开关,某个寄存器的第3位用于控制这个开关,可以通过设置1/0来控制这个开关
背景:需要将一个数二进制表示中第 i 位反转(1->0,0->1)
方法:用一个数a,让a的二进制中第 i 位为1,其余位为0,然后进行按位异或运算
适用场景:
嵌入式系统,我们要控制某个开关,某个寄存器的第3位用于控制这个开关,可以通过反转2进制位来控制这个开关
背景:需要将一个数2进制表示中最右边的1变为0
方法:将a最右边的1变为0,只需a&(a-1)
适用场景:
求一个数2进制表示中有几个1,因为每一次a=a&(a-1),让a最右边1置为0,只要进行循环,就可以得到1的个数
位图算法,Brian Kernighan算法
背景:将一个整数的2进制表示中最右边的1保留,其他位置为0
方法:以a为例,a=a&(-a)
适用场景:位图算法
1. a^a=0
2.0^a=a
3.a^b^a==a^a^b
1.圆括号()
2.自增/自减运算符 ++,--
3.单目运算符 +,-
4. 乘除法 *,/
5.加减法+,-
6.关系运算符 <,>
7.按位:&,|
8.逻辑:&&,||
9.赋值运算符 ==
优先级参考:https://zh.cppreference.com/w/c/language/operator_precedence