gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:27:42 26 4
gpt4 key购买 nike

该方法接受一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com