【发布时间】:2011-09-23 20:05:00
【问题描述】:
对于这个赋值,我只能使用基本的按位运算符,没有控制结构,所以到目前为止我已经想出了这个代码来将符号大小转换为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;
}
我哪里出错了?
【问题讨论】:
-
你不应该依赖
int是 32 位。使用int32_t确定 (stdint.h)。 -
代码正在 32 位 linux 机器上运行以进行评分,并在我的机器上运行。如果我希望它是可移植的,我想我可以使用 (sizeof(int) * CHAR_BIT - 1) 来存储位值。
-
如果练习的目的是定义明确的位操作并将您自己对符号的解释强加于位,那么您真的应该使用无符号类型。
标签: c bit-manipulation