进制转换
为什么使用二进制、八进制、十六进制?
由于现在的CPU只能识别高低两种电平,只能使用二进制数据进行计算
二进制虽然能够被计算机直接计算,但是不方便书写、记录,因此将数据以八进制方式为了更方便记录在文件中
随着CPU位数不断增加,八进制不能满足需求,所以发展出了十六进制来表示数据,
由于历史原因八进制还不能退出历史舞台
十进制转二进制
求余法: 用2对数据求余,然后再继续对商求余,知道商为0结束,过程中产生的余数就是该数据的二进制(逆序)
n %2 余数
商%2
…
127 %2 1
63 %2 1
31 %2 1
15 %2 1
7 %2 1
3 %2 1
1 %2 1
0 0
二进制:01111111
求权法: 数据- 2^(n-1) 如果可以减,则第n位为1,否则为0
137
128 64 32 16 8 4 2 1
1 0 0 0 1 0 0 1
手算: 79 28 63 119
二进制转十进制
二进制数据每位 乘2^(n-1) 结果求和
10011101 128+16+8+4+1 157
二进制转八进制
三个二进制位转为一位八进制位
二进制 10 011 001 101 110
八进制 2 3 1 5 6
二进制转十六进制
四个二进制位转为一位十六进制位
二进制 10 0110 0110 1110
十六进制: 2 6 6 E
在C代码中,以0开头的数据是八进制数据,以0x开头的是十六进制数据
%o 以八进制形式显示数据
%x 以十六进制显示数据
%#o %#x 以对应的进制显示数据
原码、反码、补码
原码
数据的二进制
反码
正数的原码就是它的反码
负数的反码是它的原码符号位不变,其它位按位求反
补码
数据在内存中是以补码形式存储的
正数的原码就是它的补码
负数的补码是它的反码+1
负数的补码:
1、数据转换为二进制
2、二进制符号位不变,其余按位求反得到反码
3、反码+1得到补码
-127
1111 1111
1000 0000
1000 0001 补码
0000000000000000000000001000 0001 %d --127->129
补码转数据
无符号的补码直接转成十进制数据
有符号看最高位是0,说明是正数,也直接转成十进制数据
有符号且最高位是1,说明是负数
1、补码-1得到反码
2、反码符号位不变,按位求反得到原码
3、原码转换成十进制
11111111 补码
11111110 反码
10000001 原码 -1
最大值+1 = 最小值
最小值-1 = 最大值
位运算
位运算符:& | ~ ^ << >>
A & B 按位相与
01101010 0x6A
01110110 0x76
01100010 0x62
A | B 按位相或
01101010 0x6A
01110110 0x76
01111110 0x7E
~A 按位求反
01101010 0x6A
10010101 0x95
A^B 按位异或 相同为0,相异为1
01101010 0x6A
01110110 0x76
00011100 0x1C
A<<n 把A的补码向左移动n位,左边丢弃,右边补0
01101010 0x6A << 4
10100000 0xA0
A>>n 把A的补码向右移动n位,右边丢弃,左边补符号位
11101010 0xEA >> 3
11111101 0xFD