从符号量转换为二进制补码

时间:2011-09-23 20:05:01

标签: c bit-manipulation

对于这个赋值,我只能使用基本的按位运算符而不能使用控制结构,所以到目前为止我已经提出了这个代码来将符号幅度转换为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;
}

我哪里出错?

1 个答案:

答案 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

然后,您只需要将-10替换为x的函数,这些函数会根据符号位生成这些值,并且看到条件的两边都成为相同的表达和条件变得不必要。