正在开发一种方法,该方法将接受一个整数 (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;
}
最佳答案
我认为没有一个位掩码可以同时适用于正面和负面情况。
首先通过检查第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 和 0x00001FFF 为 0,并且返回原始值。
如果另一方面 0x1FFF 被视为仅 13 位,那么它是负数。 num & shifter
将为 1,因为两者都设置了第 13 位。现在通过翻转位并添加位来进行二进制补码。因为您将翻转所有 32 位,所以需要使用位掩码将所有剩余的位清零。原文shifter
如果您将其向左再推一位并将其反转,则可以工作。
关于java 位运算符,abs 幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431512/