原码,补码,二进制减法

这篇博客从一道题说起,

已知 x  = (1<<31)-3,求x&-x?

这里面考察了二进制的减法,减法也就牵涉了原码补码的一些概念。

这里进行下梳理。

 

一。原码,补码概念

1.原码就是早期用来表示数字的一种方式。

一个正数,转换为二进制位就是这个正数的原码。

负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

例如:假设机器是32位系统,

int类型的 3 的原码是 00000000 00000000 00000000 00000011

对于int类型的-3的原码是00000000 00000000 00000000 00000011高位补1得到10000000 00000000 00000000 00000011

2.反码

正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

int类型的 3 的反码是 00000000 00000000 00000000 00000011,和原码一样

int类型的-3的反码是11111111 11111111 11111111 11111100

3.补码

正数的补码与原码相同,负数的补码为其原码除符号位外所有位取反(得到反码了),然后最低位加1.

int类型的 3 的补码是 00000000 00000000 00000000 00000011

int类型的 -3 的补码是 11111111 11111111 1111111 11111101

过程:10000000 00000000 00000000 00000011除符号位取反

       -> 11111111 11111111 1111111 11111100 再加1

       -> 11111111 11111111 1111111 11111101

总结来说,求负数补码有两种方法。

(1)正数原码求反+1

(2)负数原码除符号位求反+1

 

二。二进制减法

在运算过程中,从右往左逐位进行计算。 
(1)1-0=1; 
(2)0不够减1,向前借1后加2变成2;2-1=1; 
(3)0在上一步被借1所以减为-1,-1不够减0,向前借一后加2变成1;1-0=1; 
(4)在上一步被借一所以减为0,0不够减1,向前借一后加2变成2;2-1=1; 
(5)在上一步被借一所以减为-1,-1不够减1,向前借一后加2变成1;1-1=0; 
(6)在上一步被借一所以减为0,0-0=0. 
 

三。开头题目

(1) 求1<<31:10000000 0000000 00000000 00000000

(2)减去3: 

   10000000 0000000 00000000 00000000

-00000000 00000000 00000000 00000011

= 01111111 11111111 11111111 11111101 即 x

(3)求x&-x

首先求-x的外码(参考资料3),x原码求反+1,得到10000000 00000000 00000000 00000011

01111111 11111111 11111111 11111101&10000000 00000000 00000000 00000011 = 1(答案)

 

四。参考资料:

1.正数的原码,反码,补码

2.二进制减法

3.计算机负数与正数的按位与操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值