将二进制补码转换为符号幅度

我需要仅使用运算符将​​C的两个补码转换为符号幅度

! ~ & ^ | + <> 

我的方法是找到sign: int sign = !(!(a>>31));

基本上, if sign == 1 。 我想翻转数字并添加1,否则只想显示数字。

问题是我不能使用任何循环,if语句等。这就是我正在做的事情:

 int s_M = ((((a+1)>>31)^sign)+1)&sign; 

有什么建议?

来自http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs

 int const mask = v >> 31; unsigned int r = (v + mask) ^ mask; 

给出绝对值(幅度)。 如果你想简单地将符号位添加回掩码和/或第32位:

 unsigned int s_M = r | (v & 0x80000000); 

或者如果你正在寻找一个class轮:

 unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000); 

当你 2补语转换时,你应该减1而不是加。

我不完全确定输出应该是什么,但为了获得幅度你可以做这样的事情:

 int m = (a^(a>>31)) + sign; 

基本上,将负数31位向右移动将使它全部为1或0xffffffff ,然后您可以使用它来输入数字并使其为正数。 正确地指出需要添加sign ,然后在这种情况下获得正确的结果。

如果输入数字开头是正数,则移位结果为零,因此xor什么都不做。 在这种情况下添加sign也不会执行任何操作,因此会产生输入编号。

要获得最后一位,您可以使用掩码操作

  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 

因为你的限制不使用-运营商。 2's complement on -1执行2's complement on -1并将其添加到num

 To put it simple in one line num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num) ;