该方法接受一个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/