按位绝对值

时间:2011-05-25 01:05:25

标签: java bit-manipulation

如果我想找到24位二进制补码整数的绝对值,最好是屏蔽整数,如果需要则否定原始数字?

更好地说明我的意思:

public static int bitwiseAbsoluteValue(int n) {
      if (n == 0x800000) {
           return 0x000000;
      } else {
           if ((n & 0x800000) == 0x800000) {
                 return (~n + 1) & 0x7FFFFF;
           } else {
                 return n;
           }
      }
}

这会有用吗?

5 个答案:

答案 0 :(得分:2)

您还需要屏蔽第一个返回值:

return (~num + 1) & 0x7FFFFF;

如果传入的值为0x800000,您需要确定要执行的操作。当前函数将返回0,这显然是不正确的。

答案 1 :(得分:0)

嗯,没有Math.abs(n)可以这样做的一种方式就是这样:

public static int findAbs(int n){
  if(n<0){return -1*n;}
  return n;
}

答案 2 :(得分:0)

如果设置了第23位,你可以从0x1000000(1 <&lt;&lt;&lt;&lt; 24)中减去它。

答案 3 :(得分:0)

那会有用。虽然你最多可以存储+127,但最低可以存储-128。所以否定-128加1会是负数。如果返回的数字也应该是24位,则没有太多可以做的。

抱歉,将+127和-128替换为可以用24位存储的最大正数和负数。它们的目的是说明在2的补码中你可以存储负数,其绝对值大于你可以存储的最大正数。因此,如果您给出的数字是最大的负数(2的补码中为0x80000000),您需要弄清楚如何处理它。

答案 4 :(得分:0)

将其向左移8位,然后再向右移8位(算术移位,不是逻辑移位)。如果存在符号位,那将正确传播符号位。