java - 计算 n 位 2 的补数的绝对值

标签 java bit-manipulation twos-complement absolute-value

该方法接受一个 n 位 2 的补码数,我们试图找到其绝对值,以及该数的位数。以下是一些示例:

abs(0x00001234, 16);//=> 0x00001234

abs(0x00001234, 13);//=> 0x00000DCC

因此,您可以看到,在第一个示例中,0x00001234 只是产生自身,因为对于 16 位,它有足够的前导零来作为其自身。

但是,对于第二个示例,使用 13 位会使 0x00001234 的符号位为 1,因此当您将此 13 位数字转换为正数时,它会产生 0x00000DCC。

我觉得到目前为止我所拥有的应该有效,但在某些情况下不起作用:/ 知道出了什么问题或者我应该朝什么方向走吗?

编辑:还忘了提及,我们不能使用 >>> 或 +、-、*、/除非我们只是增加 1。

public static int abs(int num, int n)
{

    boolean set = ((1 << n-1) & num) == (1 << n-1);
    if (!set) {
        return num;
    } else {
        int bitmask = (0x7FFFFFFF >> (32-n)) | (1 << n-1);
        return (num ^ bitmask) + 1;
    }
}

最佳答案

哇,给稍后过来的人:

  public static int abs(int num, int n)
  {
      int topbit = 1<<(n-1);
      int ones = (topbit<<1)-1;
      num &= ones;                     // sanity check
      if (0==(topbit&num)) {
          return num;
      } else {
          return (num ^ ones) + 1;
      }
  }

所以问题是,可以从这里删除操作以使这个函数更快吗?

关于java - 计算 n 位 2 的补数的绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14422064/

相关文章:

java - 使用不同端口与 intern() 运行 2 个 Tomcat 服务器是否会锁定相同的 id?

java - 检查整数是另一个整数的位旋转

Javascript 的 Shift right with zero-fill operator (>>>) 产生意想不到的结果

c - 这学期刚开始学C,但我似乎无法理解教授在这道题中想从我们这里得到什么

assembly - 二进制补码快速方法

java - 从 Java FileInputStream 读取字节时如何区分 -1 和 0xff?

java - Android:从输入流定义图像类型(jpeg 或 jpeg2000)

javascript - {"errors": ["Invalid image URL"]} with aviary integration

java - Java 中基于 Char 频率而不是 ASCII 值重写比较器

c - "-1>>5;"是 C 中的未指定行为吗?