英文:
C Code to convert from sign magnitude to two's complement using restricted operators
问题
我正在用C语言编写代码,将原码转换为二进制补码。最高位是符号位,输入将是short类型。到目前为止,我有一个代码,但测试未通过(我没有测试案例):
int magtoComp(int x) {
int mask = x >> 15;
int mag = x & ~(1 << 15);
return (mag ^ mask) + ~mask + 1;
英文:
I am writing a code in C to convert from sign magnitude to two's compliment. The most significant bit is the sign bit and the input will be a short type.
thus far I have a code that is failing the test (I do not have test cases):
int magtoComp(int x) {
int mask = x >> 15;
int mag = x & ~(1 << 15);
return (mag ^ mask) + ~mask + 1;
答案1
得分: 3
计算二进制补码表示中的 -x
,可以执行 ~x + 1
。如果 sign
是符号位,可以写成 (x ^ -sign) + sign
。-
不被允许,但可以计算 -sign
为 ~sign + 1
。
因此,这个解决方案:
// 将一个16位符号-幅度表示转换为二进制补码
int shortSignMag2TwosComp(int x) {
unsigned y = x; // 使用无符号算术
unsigned sign = y >> 15; // 提取符号位
unsigned mag = y & ~(1u << 15); // 屏蔽掉符号位
return (mag ^ (~sign + 1)) + sign;
}
如果 int
有超过16位,你可以使用 int
替代 unsigned
来符合规则:
// 将一个16位符号-幅度表示转换为二进制补码
// 假设 int 类型具有超过15位值位
int shortSignMag2TwosComp(int x) {
int sign = x >> 15; // 提取符号位
int mag = x & ~(1 << 15); // 屏蔽掉符号位
return (mag ^ (~sign + 1)) + sign;
}
英文:
To compute -x
in two's complement representation, one performs ~x + 1
. if sign
is the sign bit, this can be written (x ^ -sign) + sign
. -
is not allowed but you can compute -sign
as ~sign + 1
.
Hence this solution:
// convert a 16-bit sign+magnitude representation to 2's complement
int shortSignMag2TwosComp(int x) {
unsigned y = x; // use unsigned arithmetics
unsigned sign = y >> 15; // extract the sign bit
unsigned mag = y & ~(1u << 15); // mask off the sign bit
return (mag ^ (~sign + 1)) + sign;
}
If int
has more than 16 bits, you can use int
in place of unsigned
to conform to the rules:
// convert a 16-bit sign+magnitude representation to 2's complement
// assuming type int has more than 15 value bits
int shortSignMag2TwosComp(int x) {
int sign = x >> 15; // extract the sign bit
int mag = x & ~(1 << 15); // mask off the sign bit
return (mag ^ (~sign + 1)) + sign;
}
答案2
得分: 0
假设你的计算机是2的补码形式,这就很简单:
uint32_t sign = data & (1u << 31);
if(sign)
{
data &= ~(1u << 31);
data *= -1;
}
或者,稍微优化一些的版本:
int32_t signmag_to_2compl (uint32_t signmag)
{
int32_t sign = (signmag & (1u << 31)) ? -1 : 1;
signmag &= ~(1u << 31);
return sign * signmag;
}
`uint32_t`,因为在2的补码机器上运行时,将有符号数存储为`int`没有任何意义。我们还希望避免在有符号数上进行位运算。
英文:
Assuming your computer is 2's complement, it's as easy as:
uint32_t sign = data & (1u << 31);
if(sign)
{
data &= ~(1u << 31);
data *= -1;
}
Or if you will, a slightly more optimized version:
int32_t signmag_to_2compl (uint32_t signmag)
{
int32_t sign = (signmag & (1u << 31)) ? -1 : 1;
signmag &= ~(1u << 31);
return sign * signmag;
}
uint32_t
since it's completely senseless to store a signed magnitude number in an int
while running on a 2's complement machine. We also want to avoid doing bitwise arithmetic on signed numbers.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论