我想对一个数字应用一个位掩码,它将模拟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的情况,至少需要1if,因为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/

10-11 19:28