我想对一个数字应用一个位掩码,它将模拟2的补码编码有符号32位整数的绝对值函数到目前为止,我已经
int absoluteValue(int x) {
int sign = x >> 31; //get most significant byte...all 1's if x is < 0, all 0's if x >= 0
int negated = (~x + 1) & sign; //negates the number if negative, sets to 0 if positive
//what should go here???
}
我走的方向对吗我真的不知道从这里走到哪里(主要是如何应用一个面具来保持原来的正值)。我也不想使用任何条件语句
最佳答案
最后一部分
negated = (~x + 1) & sign;
是错误的,你将得到1或0,你必须创建一个包含所有
前31位为0,最后一位为0或1。
假设您的目标是处理32位整数,其中2
补充一下,您可以这样做:
#include <stdio.h>
// assuming 32bit, 2 complement
int sign_inverse(int n)
{
int mask = ~n & 0x80000000U;
if(n == 0)
mask = 0;
return (~n + 1) | mask;
}
int main(void)
{
int a = 5;
int b = -4;
int c = 54;
int d = 0;
printf("sign_inverse(%d) = %d\n", a, sign_inverse(a));
printf("sign_inverse(%d) = %d\n", b, sign_inverse(b));
printf("sign_inverse(%d) = %d\n", c, sign_inverse(c));
printf("sign_inverse(%d) = %d\n", d, sign_inverse(d));
return 0;
}
但对于0的情况,至少需要1
if
,因为0的掩码是0x80000000
。其结果是:
$ ./b
sign_inverse(5) = -5
sign_inverse(-4) = 4
sign_inverse(54) = -54
sign_inverse(0) = 0
关于c - 将负数转换为正数,但保持正数不变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49835058/