【发布时间】:2013-01-20 05:49:10
【问题描述】:
该方法接受一个 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;
}
}
【问题讨论】:
-
给出一些失败的案例...
-
每当 n 变量截止使 num 变量在 2 的补码中为负时,它就会失败。所以例如 abs(0x00001234, 13) 失败
标签: java bit-manipulation twos-complement absolute-value