java位运算符,abs功率

时间:2013-01-21 01:57:36

标签: java bit

处理一个接受整数(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;

}

2 个答案:

答案 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可以工作,如果再向左推一个并将其反转。