原码,补码,二进制减法计算_二进制的原码和补码

大家好,又见面了,我是你们的朋友全栈君。

这篇博客从一道题说起,

已知 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.计算机负数与正数的按位与操作

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。