对于这个赋值,我只能使用基本的按位运算符而不能使用控制结构,所以到目前为止我已经提出了这个代码来将符号幅度转换为two's complement。
int sm2tc(int x) {
// Invert and add 1
// Problem: sm has 2 zeros.. 1000...000 & 0000...000
int tmin = 1 << 31;
int mask = x >> 31; // Determine sign of x
int mask2 = ~tmin; // Negate tmin to get 0111111...
int first = (x ^ mask) + (~mask + 1) ;
int second = first & mask2; // Turns of MSB
return second;
}
我哪里出错?
答案 0 :(得分:2)
所以,你真正想要计算的是
result = (x & sign_bit) ? -(x & ~sign_bit) : x;
但当然你不允许控制结构。第一步是仅使用-(x & ~sign_bit)
和+
运算符重写^
:(-1 ^ (x & ~sign_bit)) - -1
。现在请注意,如果(x & sign_bit)
为零,则(0 ^ (x & ~sign_bit)) - 0
等于x
。我们现在有
result = (x & sign_bit) ? (-1 ^ (x & ~sign_bit)) - -1 : (0 ^ (x & ~sign_bit)) - 0
然后,您只需要将-1
和0
替换为x
的函数,这些函数会根据符号位生成这些值,并且看到条件的两边都成为相同的表达和条件变得不必要。