在不使用 abs 函数或 if 语句的情况下获取绝对值

新手上路,请多包涵

我在想如何在不使用 if 语句或 abs() 的情况下获得整数的绝对值。起初我使用左移位( << ),试图让负号超出范围,然后将位右移回原来的位置,但不幸的是它对我不起作用。请让我知道为什么它不起作用以及其他替代方法。

原文由 shanwu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 722
2 个回答

来自 Bit Twiddling Hacks

 int v;           // we want to find the absolute value of v
unsigned int r;  // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;

r = (v + mask) ^ mask;

原文由 Hasturkun 发布,翻译遵循 CC BY-SA 3.0 许可协议

位移(原则上)是实现定义的,但转换为更广泛的有符号整数类型将扩展符号位。如果您将高位解释为整数,它们将为 0 或 -1,这将让您反转 2 的补码:

 int32_t abs(int32_t in)
{
  int64_t in64 = (int64_t)in;
  int32_t* ptr = (int32_t*)&in64;
  int32_t hi = *(++ptr); // assumes little-endian
  int32_t out = (in ^ hi) - hi;
  return out;
}

上述机制是在打开优化的情况下编译朴素实现的结果:

 mov         eax,ecx
cdq
xor         eax,edx
sub         eax,edx

原文由 caldfir 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题