2011-09-23 38 views
1

对于这个任务,我只能使用基本的按位运算符和没有控制结构,所以我已经拿出这个代码到目前为止将符号大小转换为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

你不应该依赖32位的int。使用'int32_t'确定('stdint.h')。 – 2011-09-23 20:10:36

+0

该代码正在32位Linux机器上运行,用于评分和在我的机器上运行。如果我希望这是可移植的,我想我可以使用(sizeof(int)* CHAR_BIT - 1)来存储位值。 – tippenein

+0

如果练习的目的是为了具有良好定义的位操作并对位进行签名,你应该使用无符号类型。 –

回答

2

所以,你真的要计算的是

result = (x & sign_bit) ? -(x & ~sign_bit) : x; 

但是,当然,你不允许控制结构。第一步是使用+^运营商:(-1^(x & ~sign_bit)) - -1重写-(x & ~sign_bit)。现在请注意,如果(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功能,你瞧条件的双方成为同样的表情和状态变得不必要。

+0

您假设底层平台基于2的补码表示。你为什么做这个假设?你为什么不假定这个平台实际上是基于数量级的?我想说,针对这个特定问题的“干净”解决方案不应该依赖任何平台的细节。例如,您的原始表达式在符号量级的平台上是无操作的。 – AnT

+0

我们在OP的文章中看到的是明确尝试制作独立于平台的解决方案。所以,你所做的并不完全是OP所需要的。换句话说,你不能依赖'-x'产生2的补码表示,即一元'-'被禁止。 – AnT

+0

你的解释很棒。我所要做的就是将我将MSB解除固定的行切换到实际转换之前 – tippenein

相关问题