将二进制补码转换为符号数值

标签 c twos-complement

我需要仅使用运算符将​​ 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/

相关文章:

c - 按位运算和移位

java - 补码误差

C可扩展数组

c - 我如何防止我的代码接受小数,并且只接受整数

c - 使用 fork 查找矩阵中的数字

c - 为什么 -(-2147483648) = - 2147483648 在 32 位机器上?

java - 按位非运算符

c - 用 C 写入文件不起作用

cs50 pset3,频率功能不起作用

algorithm - 如何在将两个2的补码整数相乘时检测到溢出?