C++学习之路【1】:标C数据结构和算法
二进制
一个字节可以分成八段,每段可以记录一个0或者1
为了把一个数字记录到一个字节里就必须首先把他转换成八个0或者1
用一组0或者1表示数字的方法叫做二进制
任何一个数字既可以用十进制方式表示也可以用二进制方式表示
计算机里只能记录以二进制方式表示的数字
二进制表示方式中每个数位(bit)有一个编号,最后边数位的编号是0,向左依次递减
逢二进一:00001111 + 1 = 00010000
有符号类型的数字(不加unsigned修饰)才有符号
二进制”最左边“的位叫做符号位
符号位为0表示非负数,符号位为1表示负数
01011010(前提是char类型)- 正数
11011010(前提是char类型)-负数
10101010(前提是unsigned char类型)-正数
10101010(short类型)-正数
十进制的非负转二进制
例如:前提是unsigned char(1字节,8位)的91转二进制:
91/2=45 余1 - 0
45/2=22 余1 - 1
22/2=11 余0 - 2
11/2=5 余1 - 3
5/2=2 余1 - 4
2/2=1 余0 - 5
1/2=0 余1 - 6
先得到的数位为低位,后得到的数位为高位
91对应的二进制就是001011011(不够8位,高位补0,凑够1字节)
负数,符号位(最高位)为1转换:
二转十:取反加一,转十添负(取反:1变0,0变1)
char类型
10100011取反01011100加一01011101转十93添负-93
10010011取反01101100加一01101101转十109添负-109
十转二:去负转二,取反加一
-93去负93转二01011101取反10100010加一10100011
-109去负109转二01101101取反10010010加一10010011
short类型
-93去负93转二00000000 01011101取反11111111 10100010加一11111111 10100011
HEX:16进制 DEC:10进制 OCT:8进制 BIN:2进制
BYTE:1字节8位 WORD:2字节16位
DWORD:4字节32位 QWORD:8字节64位
八进制
八进制概念:将二进制数从右边到左边每3位分为一组,每组用0~7的数字替换得到8进制形式
字面值前缀:0,例如:0520
printf/scanf格式化占位符:%[#]o
11101001 —> 11 101 001 —> 351 —> 0351
printf("%o\n, 0520"); //520
printf("%#o\n, 0520"); //0520
八进制一般用来表示文件权限
十进制 | 二进制 | 八进制 |
---|---|---|
93 | 01 011 101 | 0135 |
109 | 01 101 101 | 0155 |
-93 | 10 100 011 | 0243 |
-109 | 10 010 011 | 0223 |
-191 | 1 111 111 101 000 001 | 0177501 |
十六进制
十六进制概念:把二进制从右边到左边每4位分一组,每组用一个字母替换,用a~ f替换10~ 15,0~ 9不用替换
字面值前缀:0x/0X,例如:0xb520或者0XB520
printf/scanf格式化占位符:%[#]x/X
例如:1100 0011 —> 12 3 —> c 3 —> 0xc3
printf("%x\n", 0x520); //520
printf("%#x\n", 0x520); //0x520
十进制 | 二进制 | 十六进制 |
---|---|---|
0 | 0000 | 0 |
1 | 0001 | 1 |
2 | 0010 | 2 |
3 | 0011 | 3 |
4 | 0100 | 4 |
5 | 0101 | 5 |
6 | 0110 | 6 |
7 | 0111 | 7 |
8 | 1000 | 4 |
9 | 1001 | 9 |
10 | 1010 | a/A |
11 | 1011 | b/B |
12 | 1100 | c/C |
13 | 1101 | d/D |
14 | 1110 | e/E |
15 | 1111 | f/F |
十进制 | 二进制 | 十六进制 |
---|---|---|
93 | 0101 1101 | 0x5d |
109 | 0110 1101 | 0x6d |
-93 | 1010 0011 | 0xa3 |
-109 | 1001 0011 | 0x93 |
-191 | 1111 1111 0100 0001 | 0xff41 |