进制转换与原码、反码、补码

进制转换

为什么使用二进制、八进制、十六进制:

  1. 因为现在的CPU只能识别高低两种电流,只能对二进制数据进行计算。

  2. 二进制数据虽然可以直接被CPU计算识别,但是不方便书写、记录,把二进制数据转换为八进制是为了方便记录在文档中。

  3. 随着CPU的位数不断的增加,由早期的8位逐渐发展成了现在的64位,因此八进制就不能满足需要了,所以发展出了十六进制。

  4. 由于历史原因八进制还不能退出历史舞台(例如文件的权限还是八进制 m=4+2+1)

十进制转二进制(其他进制也适用求余法):

求余法:用2对数据进行求余,然后用商继续求余,

直到商为0结束,过程中产生的余数就是该数据的二进制(逆序)
127 %2 1
63 %2 1
31 %2 1
15 %2 1
7 %2 1
3 %2 1
1 %2 1
0
01111111

求权法:数据 - 2^(n-1) 如果可以减,则第n位就是1,否则是0
1 2 4 8 16 32 64 128

二进制转十进制:每一位*2^(n-1) 求和
4+8+32+128=172
10101100

二进制转八进制:从低位起每三位二进制位对应一个八进制位
10 101 100
2 5 4

二进制转十六进制:从低位起每四位二进制位对应一个十六进制位
二进制:1010 1110 0010 1101
十六进制:A E 2 D

在C代码中,以0开头的都是八进制数据,以0x开头的都是十六进制数据
%x 以十六进制显示数据
%o 以八进制显示数据
%#x、%#o 以对应的进制来显示数据

原码、反码、补码:

原码:数据的二进制
反码:
正数的原码就是它的反码。
负数的反码就是它的原码,符号位不变,其它位按位取反
补码:数据在内存中储存的二进制
正数的原码就是补码。
负数的补码:
1、转换成原码
2、把原码符号位不变,按位求反得到反码
3、把反码+1得到补码

-127 127
11111111 原码 01111111
10000000 反码 01111111
10000001 补码 01111111

补码转原码:
无符号补码直接转成原码,转成十进制。
有符号且最高位是1:
1、补码-1得到反码
2、反码的符号位不变,其它位按位求反得到原码
3、原码转换成10进制

补码:1111111
反码:1111110
原码:1000001 -1

位运算符:
A & B:按位相与
0101 1101 0x5d
1001 1001 0x99
--------
00011001 0x19

A | B:按位相或
0101 1101 0x5d
1001 1001 0x99
--------
1101 1101 0xdd
~A:按位求反
0101 1101 0x5d
1010 0010 0xa2

A ^ B:按位异或(不同输出1,相同输出0)
0101 1101 0x5d
1001 1001 0x99
--------
1100 0100 0xc4

A << n: 把A的补码左移n位,左边的丢弃,右边补0
01011101 << 4
11010000 0xd0

A >> n:把A的补码右移n位,右边的丢弃,左边补符号位
11011010 >> 4 0xda
11111101 0xfd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值