java 位运算符,abs 幂

标签 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;

}

最佳答案

我认为没有一个位掩码可以同时适用于正面和负面情况。

首先通过检查第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/

相关文章:

java - 方法调用的返回类型是什么?

java - jList - 添加元素并显示字符串?

java - 位打包 LZW 短语编号

c - 访问数组中的每个第 n 个元素(汉明代码)

java - 了解 strictMath java 库

java - 为什么 Java 8 Streams 只能从 API 级别 24 开始使用?

java - 如何在Java应用程序中将数据写入CSV文件

java - Android 为什么我会遇到循环依赖异常

java - 什么是位模式?

java - “如果”和 'Else' 在 Java 中不起作用?