c语言从0开始_6 进制转换、原反补码、位运算

进制转换

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

由于现在的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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值