C 转换两个';符号量补
我只需要使用运算符,将2的补码转换为C中的符号大小C 转换两个';符号量补,c,twos-complement,C,Twos Complement,我只需要使用运算符,将2的补码转换为C中的符号大小 ! ~ & ^ | + << >> 有什么建议吗?当你从2补码转换成时,你应该减去1,而不是相加 我不完全确定输出应该是什么,但要获得大小,可以这样做: int m = (a^(a>>31)) + sign; 基本上,将负数31位向右移位将使其全部为1,或0xffffffff,然后可以使用它对输入数进行异或运算,使其为正数。正如您正确指出的,在这种情况下,需要添加符号,以获得正确的结果 如果输入的
! ~ & ^ | + << >>
有什么建议吗?当你从2补码转换成时,你应该减去1,而不是相加 我不完全确定输出应该是什么,但要获得大小,可以这样做:
int m = (a^(a>>31)) + sign;
基本上,将负数31位向右移位将使其全部为1,或0xffffffff
,然后可以使用它对输入数进行异或运算,使其为正数。正如您正确指出的,在这种情况下,需要添加符号,以获得正确的结果
如果输入的数字一开始是正的,那么移位的结果是零,所以异或什么也不做。在这种情况下,添加
符号也没有任何作用,因此它会导致输入数字。要获得最后一位,可以使用掩码操作
int last_bit = 32 bit integer & 0x80000000
o/p may be 0 or 0x80000000
如果是0
,只需显示给定的数字,否则必须执行以下操作以符号量表示
1)从数字中减去1
2)对结果执行1s补码(即否定~
)
3)设置结果数的最后一位
I mean ( ~ (num -`1) ) | 0x7fffffff
由于您被限制不使用-
运算符。对-1执行2的补码,并将其添加到num
To put it simple in one line
num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num) ;
从
给出绝对值(大小)。如果您希望将符号位添加回,只需掩码和/或第32位:
unsigned int s_M = r | (v & 0x80000000);
或者,如果您正在寻找一个班轮:
unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);
欢迎来到SO。您可以使用代码格式和反勾号来设置代码格式,以便于阅读。您可以使用三元运算符吗?这就是问题所在,我不能。这就是为什么这件事很棘手的原因,我必须利用我的现有资源。我不能在int const mask=v>>31中使用&&或| just&或| Whyconst
代码>?问题是如果我有数字0x80000001,它应该被转换成-1,而不是-2147483647。@chux我从Bit Twiddling Hacks链接中得到了它。通过使某些内容保持常量,我认为它可能有助于编译器进行某些优化,尽管我真的不确定。@2的补码中的user2938343(-1)是0xFFFFFF,而不是0x8000001(-2147483647)。如果在转换器中使用-1,则会得到0x80000001,因为设置了第32位(-sign),并且您的值为1。除非我误解了你的问题。。。
unsigned int s_M = r | (v & 0x80000000);
unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);