原码,补码,⼆进制减法
这篇博客从⼀道题说起,
已知 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.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。