如果我想找到24位二进制补码整数的绝对值,最好是屏蔽整数,如果需要则否定原始数字?
更好地说明我的意思:
public static int bitwiseAbsoluteValue(int n) {
if (n == 0x800000) {
return 0x000000;
} else {
if ((n & 0x800000) == 0x800000) {
return (~n + 1) & 0x7FFFFF;
} else {
return n;
}
}
}
这会有用吗?
答案 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位(算术移位,不是逻辑移位)。如果存在符号位,那将正确传播符号位。