我需要仅使用运算符将 C 语言中的补码转换为符号数值
! ~ & ^ | + << >>
我的方法是找到符号:
int 符号 = !(!(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);
或者,如果您正在寻找单衬:
unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);
关于将二进制补码转换为符号数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19689586/