该方法接受一个 n 位 2 的补码数,我们试图找到其绝对值,以及该数的位数。以下是一些示例:
abs(0x00001234, 16);//=> 0x00001234
abs(0x00001234, 13);//=> 0x00000DCC
因此,您可以看到,在第一个示例中,0x00001234 只是产生自身,因为对于 16 位,它有足够的前导零来作为其自身。
但是,对于第二个示例,使用 13 位会使 0x00001234 的符号位为 1,因此当您将此 13 位数字转换为正数时,它会产生 0x00000DCC。
我觉得到目前为止我所拥有的应该有效,但在某些情况下不起作用:/ 知道出了什么问题或者我应该朝什么方向走吗?
编辑:还忘了提及,我们不能使用 >>> 或 +、-、*、/除非我们只是增加 1。
public static int abs(int num, int n)
{
boolean set = ((1 << n-1) & num) == (1 << n-1);
if (!set) {
return num;
} else {
int bitmask = (0x7FFFFFFF >> (32-n)) | (1 << n-1);
return (num ^ bitmask) + 1;
}
}
最佳答案
哇,给稍后过来的人:
public static int abs(int num, int n)
{
int topbit = 1<<(n-1);
int ones = (topbit<<1)-1;
num &= ones; // sanity check
if (0==(topbit&num)) {
return num;
} else {
return (num ^ ones) + 1;
}
}
所以问题是,可以从这里删除操作以使这个函数更快吗?
关于java - 计算 n 位 2 的补数的绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14422064/