1 进制
中国人说:三 英国人说:three 数学家说:3 书法家说:叁
10进制:16 16进制:0x10 8进制: 020 2进制: 0b10000
为什么是这样?
10进制里,每一位的权重,从右往左数:个十百千万,也就是:10^0, 10^1, 10^2,10^3…… 16进制里,每一位的权重,从右往左数,分别是:16^0, 16^1, 16^2, 16^3, 16^4, …… 8进制里,每一位的权重,从右往左数,分别是:8^0, 8^1, 8^2, 8^3, 8^4, …… 2进制里,每一位的权重,从右往左数,分别是:2^0, 2^1, 2^2, 2^3, 2^4, ……
10进制,逢10进1,
16 = 1*10^1 +6*10^0 = 1616进制:逢16进1,
0x10 = 1*16^1 + 0*16^0 = 168进制: 逢8进1,
020 = 2*8^1 + 0*8^0 = 162进制: 逢2进1,
0b10000 = 1*2^4 + 0*2^3 + 0*2^2 + 0*2^1 +0*2^0 = 16它们表示的值是一样的。
在代码里, 10进制这样写:123456789,每位最大值为9;16进制这样写:0x12ABCDEF, 每位最大值为15, A表示10,B表示11,C表示12,D表示13,E表示14,F表示15 ;8进制这样写:01234,每位最大值为7 ; 2进制这样写:0b0110,每位最大值为1 (注意:C语言没有二进制数值的表示方法)
2 字节序与位操作
2.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 位操作
2.2.1 逻辑移位
在嵌入式开发中,我们只涉及逻辑移位:不关心符号位,都是补0
算术移位,需要分有符号型值和无符号型值:
对于无符号型值,算术移位等同于逻辑移位。
对于有符号型值 ,算术左移等同于逻辑左移;算术右移补的是符号位,正数补0,负数补1。
2.1.2 逻辑左移
int a = 0x123; int b = a<<2; // b=0x48C
2.1.3 逻辑右移
int a = 0x123; int b = a>>2; // b=0x48\
2.2 取反
unsigned int a = 0x123;
unsigned int b = ~a; // b的每一位,都是a对应位的取反\
2.3 位与
unsigned int a = 0x123;
unsigned int b = 0x456;
unsigned int c = a & b; // c等于a位与b,即:a,b的每一位进行与操作
两位相与,结果如下:
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
所以,上述C语言代码的结果如下图所示:
2.4 位或
unsigned int a = 0x123;
unsigned int b = 0x456;
unsigned int c = a | b; // c等于a位或b,即:a,b的每一位进行或操作
两位相或,结果如下:
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
所以,上述C语言代码的结果如下图所示:
2.5 置位
unsigned int a = 0x123;
unsigned int b = a | (1<<7) | (1<<8); // 设置a的bit7, bit8, 赋给b
2.6 清位
unsigned int a = 0x123;
unsigned int b = a & ~((1<<7) | (1<<8)); // 清除a的bit7, bit8, 赋给b
2.7 把某几位设置为某值
比如要把bit7设置为1,把bit8清除为0,这可以分两步操作:先设置bit7,再清除bit8。
还有一种情况:bit[8:7]= val, 不知道val的取值是多少,怎么办?
先清除bit8、bit7,再或上val,代码如下:
unsigned int a = 0x123;
unsigned int b = a & ~(3<<7); /* 清除bit7, bit8 */
b = b | (val << 7); /* 设置bit7, bit8为val */
最重要的是清除和置位。后面的寄存器的操作,会大量的使用。