1.正数和负数中原码、反码、补码的区别
原码:正数的符号位为0,负数的符号位为1
反码(基于原码变动):正数的反码跟原码相同;负数的反码,除了符号位,其他全部取反
补码(基于反码变动):正数的补码,就跟原码、反码都相同;负数的补码,在其反码的基础上,加1
注:系统中二进制均以补码形式存在。
2.Java中>>> 和 >> 的区别
1) >>> 表示不带符号向右移动二进制数,移动后前面统统补0;
2) >> 表示带符号向右移动二进制数 ,正数右移高位补0,负数右移高位补1
注:带符号和不带符号,是指用不用符号位来补。但是符号位都是跟着动的。
3.思路
惯用做法:把传进来的正数转变成负数处理,
因为负数可以表达的绝对值域比正数表达的绝对值域大一个
4.代码
public static int reverse(int x) {
//判断数值的正负
boolean judge = ((x >>> 31) & 1) == 1;
//把正数转成负数处理
x = judge ? x : -x;
int minc = Integer.MIN_VALUE / 10;
int miny = Integer.MIN_VALUE % 10;
int res = 0;
while (x != 0) {
//检测溢出
if (res < minc || (res == minc && x % 10 < miny )) {
return 0;
}
res = res * 10 + x % 10;
x /= 10;
}
return judge ? res : Math.abs(res);
}