2

研究一种将采用整数 (num) 和整数 (n) 的方法,该整数 (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;

}
4

2 回答 2

1

使用-1(全 1 位)作为移位器。

int shifter = -1 << n;
于 2013-01-21T02:16:22.337 回答
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 和 0x00001FFF 为 0,您返回原件。

另一方面,如果 0x1FFF 仅被视为 13 位,则为负数。 num & shifter将为 1,因为两者都设置了第 13 位。现在通过翻转位和添加位来进行二进制补码。因为您将翻转所有 32 位,所以您需要使用位掩码将所有剩余的位清零。shifter如果您将其再向左推一点并将其反转,则原始作品将起作用。

于 2013-01-21T02:56:47.170 回答