处理一个接受整数(num)和整数(n)的方法,该整数将采用n位数的绝对值。我相信我的逻辑是正确的,已经在纸上完成了它并且它已经解决了但代码似乎已经关闭了。非常感谢所有帮助!
/**
* Take the absolute value of an n-bit number.
*
* Examples:
* abs(0x00001234, 16); // => 0x00001234
* abs(0x00001234, 13); // => 0x00000DCC
*
* Note: values passed in will only range from 1 to 31 for n.
*
* @param num An n-bit 2's complement number.
* @param n The bit length of the number.
* @return The n-bit absolute value of num.
*/
public static int abs(int num, int n)
{
int shifter = num << (n+1);
int newInt = num & ~shifter;
return newInt;
}
答案 0 :(得分:1)
使用-1
(全1位)作为移位器。
int shifter = -1 << n;
答案 1 :(得分:1)
我认为没有一个位掩码适用于正面和负面情况。
首先通过检查第n位为1来测试数字是否为负;如果没有,返回原来,否则返回两个补码。
这样的东西看起来很有效:
public static int abs(int num, int n)
{
int shifter = -1 << (n - 1);
if ((num & shifter) == 0)
return num;
shifter = shifter << 1;
return (~num + 1) & ~shifter;
}
例如,假设您将0x1FFF作为16位数传入,因此它是正数
-1 << 15
将为0xFFFF8000(最低15位为0,其余为1位),0xFFFF8000&amp; 0x00001FFF为0,并返回原始文件。
另一方面,如果0x1FFF仅被视为13位,那么它是负数。 num & shifter
将为1,因为两者都设置了第13位。现在通过翻转位并添加一个来完成两个补码。因为你将翻转所有32位,你需要使用位掩码来清除所有剩余的位。原来的shifter
可以工作,如果再向左推一个并将其反转。