我在想如何在不使用 if
语句或 abs()
的情况下获得整数的绝对值。起初我使用左移位( <<
),试图让负号超出范围,然后将位右移回原来的位置,但不幸的是它对我不起作用。请让我知道为什么它不起作用以及其他替代方法。
原文由 shanwu 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在想如何在不使用 if
语句或 abs()
的情况下获得整数的绝对值。起初我使用左移位( <<
),试图让负号超出范围,然后将位右移回原来的位置,但不幸的是它对我不起作用。请让我知道为什么它不起作用以及其他替代方法。
原文由 shanwu 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
来自 Bit Twiddling Hacks :