我需要仅使用运算符
将C中的二进制补码转换为符号幅度! ~ & ^ | + << >>
我的方法是寻找标志:
int sign = !(!(a>>31));
if sign == 1
。我想翻转数字并添加1,否则只想显示数字。
问题是我不能使用任何循环,if语句等。 这就是我正在做的事情:
int s_M = ((((a+1)>>31)^sign)+1)&sign;
有什么建议吗?
答案 0 :(得分:1)
来自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);
或者,如果你正在寻找一个班轮:
unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);
答案 1 :(得分:0)
当你从 2补码中转换时,你应该减去1,而不是添加。
答案 2 :(得分:0)
我不完全确定输出应该是什么,但为了获得幅度你可以做这样的事情:
int m = (a^(a>>31)) + sign;
基本上,将负数31位向右移动将使它全部为1或0xffffffff
,然后您可以使用它来输入数字并使其为正数。正如您正确指出的那样,sign
需要添加,然后才能获得正确的结果。
如果输入数字开头是正数,则移位结果为零,因此xor什么都不做。在这种情况下添加sign
也不会做任何事情,因此会产生输入数字。
答案 3 :(得分:0)
要获得最后一位,您可以使用掩码操作
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
并将其添加到num
。
To put it simple in one line
num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num) ;