目录
一、编程知识 - 进制
n进制:逢n进1
1、方向引入
(1) 二进制
- 晶体管只有两个状态① ON:1 ② OFF:0
- 数据使用多个晶体管表示。
- 如:8bit数据
- 用二进制描述,吻合硬件状况。
(2)更方便的描述一个值
- 八进制:3bit一组(001,100,000),在八进制里用1位表示(这一位取值范围0~7)
- 十六进制:4bit一组(0110,0000),在十六进制里用1位表示(这一位取值范围0~15)
2、如何快速转换二进制、八进制、十六进制?
8421 ---> 二进制权重
1111 = 1*2^3+1*2^2+1*2^1+1*2^0
= 1*8+1*4+1*2+1*1
(1)二进制转八进制、十六进制
例如:0b01101110101(0b代表二进制)
① 二进制转八进制
2 1 4 2 1 4 2 1 4 2 1
八进制:0 1,1 0 1,1 1 0,1 0 1
上下相乘 1 5 6 5
最后答案:1565
② 二进制转十六进制
4 2 1 8 4 2 1 8 4 2 1
十六进制:0 1 1, 0 1 1 1 ,0 1 0 1
上下相乘 3 7 5
最后答案:375
(2)十六进制转二进制
例如:0xABC1(0X代表十六进制)
0x A B C 1
10 11 12 01
8421凑数:8421 8421 8421 8421
1010 1011 1100 0001
3、在C语言中,怎么表示八进制、十进制、十六进制?
int a = 96; // 十进制
int a = 0140; // 0开头,八进制
int a = 0x60; // 0x开头,十六进制
二、编程知识 - 字节序 - 位操作
1、字节序
假设int a = 0x12345678;
- 16进制数中每位数值占据4 bit;在内存中,是以8个bit作为1byte。
- 因此0x12345678中每两位作为1byte, 其中0x78是低byte,0x12是高byte。
在内存中的存储方式有两种:
- 0x12345678的低位(0x78)存在低地址,即方式1,叫做小字节序(Little endian);
- 0x12345678的高位(0x12)存在低地址,即方式2,叫做大字节序(Big endian);
- 一般的arm芯片都是小字节序,有些处理器,可以置某个寄存器,让整个系统使用大字节序或小字节序。
2、位操作
2.1 逻辑移位
在嵌入式开发中,我们只涉及逻辑移位:不关心符号位,都是补 0 算术移位,需要分有符号型值和无符号型值:
-
对于无符号型值,算术移位等同于逻辑移位。
-
对于有符号型值 ,算术左移等同于逻辑左移;算术右移补的是符号位,正数补0,负数补1。
2.1.1 逻辑左移
int a = 0x123; int b = a<<2; // b=0x48C
2.1.2 逻辑右移
int a = 0x123; int b = a>>2; // b=0x48
2.2 取反
unsigned int a = 0x123;
unsigned int b = ~a; // b的每一位,都是a对应位的取反