这是一个相当简洁的表达式,可以解决这个问题:
return ((x < 0 ^ y) & x!=0) << 31 | (x!=0) << 31 >> 31 & 0x7fffffff & x | x==0x80000000 ;
这适用于 32 位 2 的补码整数,其中 x 是输入,y 是 1 或 0。1 表示返回 x 的相反符号,0 表示返回与 x 相同的符号。
这是函数 f() 中该表达式的更长版本。我添加了一些测试用例来验证。
#include <limits.h>
#include <stdio.h>
int bitsm1 = 31;
int rightbits = 0x7fffffff;
int f (x, y) {
int sign_x = x < 0;
int signtemp = sign_x ^ y;
int notzero = x!=0;
int v = notzero << bitsm1;
v = v >> bitsm1;
v = v & rightbits;
int b = v & x;
int c = (signtemp & notzero) << bitsm1;
int z = c | b;
int res = z | (x==INT_MIN);
return res;
}
int main () {
printf("%d\n", f(0,0)); // 0
printf("%d\n", f(0,1)); // 0
printf("%d\n", f(1,0)); // +
printf("%d\n", f(1,1)); // -
printf("%d\n", f(-1,0)); // -
printf("%d\n", f(-1,1)); // +
printf("%d\n", f(INT_MAX,0)); // +
printf("%d\n", f(INT_MAX,1)); // -
printf("%d\n", f(INT_MIN,0)); // -
printf("%d\n", f(INT_MIN,1)); // +
return 0;
}