按位绝对值

问题描述

| 如果我想找到24位二进制补码整数的绝对值,是否最好屏蔽该整数,并且如果需要,可以抵消原始数字? 为了更好地说明我的意思:
public static int bitwiseAbsoluteValue(int n) {
      if (n == 0x800000) {
           return 0x000000;
      } else {
           if ((n & 0x800000) == 0x800000) {
                 return (~n + 1) & 0x7FFFFF;
           } else {
                 return n;
           }
      }
}
这行得通吗?     

解决方法

您还需要屏蔽第一个返回值:
return (~num + 1) & 0x7FFFFF;
而且,如果传入的值为you2ѭ,则需要计算要执行的操作。当前函数将返回
0
,这显然是不正确的。     ,嗯,不用
Math.abs(n)
就可以完成的一种方法是这样的:
public static int findAbs(int n){
  if(n<0){return -1*n;}
  return n;
}
    ,如果设置了位23,则可以从0x1000000(1 << 24)中减去它。     ,那行得通。虽然您最多只能存储+127,而最多可以存储负数-128。因此,负数-128加1将为负数。如果返回的数字也应该是24位,则没有太多可做的事情。 抱歉,将+127和-128替换为可以用24位存储的最大正数和负数。它们旨在说明以下几点:在2的补码中,您可以存储负数,该负数的绝对值比可以存储的最大正数大1。因此,如果给定的数字是最大的负数(2的补码中的0x80000000),则需要弄清楚如何处理。     ,将其左移8位,然后再次右移8位(算术移位,而非逻辑移位)。如果有一个符号位,它将正确传播符号位。