大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
这篇博客从一道题说起,
已知 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(答案)
四。参考资料:
2.二进制减法
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189671.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...