在C+;中,计算长整型整数绝对值的最快方法是什么+;? < > C++中长long int类型的绝对值的最快计算方法是什么?是否可以不使用if()语句?我试图转换为unsigned,然后再转换为signed,但它不起作用。

在C+;中,计算长整型整数绝对值的最快方法是什么+;? < > C++中长long int类型的绝对值的最快计算方法是什么?是否可以不使用if()语句?我试图转换为unsigned,然后再转换为signed,但它不起作用。,c++,C++,您应该使用LLAB。请参阅您应该使用的LLAB。请参见改编自: 改编自: 试着用三元运算符profile,自己看。试着用三元运算符profile,自己看。你需要多快?计算绝对值是否是程序性能的瓶颈?如果平台中有,您认为的成本是多少?(顺便说一句,你的平台是什么?@Keith Thompson是的,因为我需要计算曼哈顿distance@Qbik:这并不能回答基思的问题。他的问题不是你为什么要这样做,而是你是否需要压缩这个特定操作的最后一点性能。你需要每秒计算多少次曼哈顿距离?@David Rodr

您应该使用
LLAB
。请参阅您应该使用的
LLAB

。请参见改编自:

改编自:




试着用三元运算符profile,自己看。

试着用三元运算符profile,自己看。

你需要多快?计算绝对值是否是程序性能的瓶颈?如果平台中有
,您认为
的成本是多少?(顺便说一句,你的平台是什么?@Keith Thompson是的,因为我需要计算曼哈顿distance@Qbik:这并不能回答基思的问题。他的问题不是你为什么要这样做,而是你是否需要压缩这个特定操作的最后一点性能。你需要每秒计算多少次曼哈顿距离?@David Rodríguez几乎1GB的数据你需要它有多快?计算绝对值是否是程序性能的瓶颈?如果平台中有
,您认为
的成本是多少?(顺便说一句,你的平台是什么?@Keith Thompson是的,因为我需要计算曼哈顿distance@Qbik:这并不能回答基思的问题。他的问题不是你为什么要这样做,而是你是否需要压缩这个特定操作的最后一点性能。你需要多少次计算每秒曼哈顿距离?@David Rodríguez几乎1GB的数据为什么我要在
std::abs
上使用这个?这是我应该使用的。也许我被误导了。说清楚,这个答案没有错。但是,更好的选择确实存在,并且在可能的情况下应该加以利用。感谢您提供的信息。:-)为什么我要在std::abs上使用这个呢?这就是我应该使用的。也许我被误导了。说清楚,这个答案没有错。但是,更好的选择确实存在,并且在可能的情况下应该加以利用。感谢您提供的信息。:-)唯一的问题是它需要一个非常具体的
long
实现,虽然这种实现非常普遍,但并不完全可移植。。。在某些平台上,这些都是具体的非分支指令,用于实现具有基本类型的三元运算符……我喜欢这个答案。我现在假设这意味着管道一定会饱和,而不是依赖分支预测在某些时候为您提供改进,这是正确的吗?如果是这样,那么这比分支更快。@nonsensical:Profile。在某些平台上,ternaries可以优化为条件移动(或,例如,在ARM上,条件指令),这些移动通常与算术指令一样快。@荒谬的是,您用多个逻辑和算术运算替换了一个分支。你不能保证它会更快,尤其是当你的大多数输入都是一个符号或另一个符号时。你的编译器总是有可能首先使用非分支指令。唯一的问题是它需要一个非常具体的
long
实现,虽然这种实现非常普遍,但并不完全可移植。。。在某些平台上,这些都是具体的非分支指令,用于实现具有基本类型的三元运算符……我喜欢这个答案。我现在假设这意味着管道一定会饱和,而不是依赖分支预测在某些时候为您提供改进,这是正确的吗?如果是这样,那么这比分支更快。@nonsensical:Profile。在某些平台上,ternaries可以优化为条件移动(或,例如,在ARM上,条件指令),这些移动通常与算术指令一样快。@荒谬的是,您用多个逻辑和算术运算替换了一个分支。你不能保证它会更快,尤其是当你的大多数输入都是一个符号或另一个符号时。而且编译器在一开始就可能使用非分支指令。
std::abs
是否比针对
0x80000000000000
的异或运算更快?@Magtheridon96可能不会。然而,
std::abs
是可移植的,而比特黑客则不是。@Magtheridon96
std::abs
将是可移植的。关于速度,我想说的是一样的:个人资料,自己看看。哦,好吧,便携性最终获胜。我想配置文件,但我的磁盘空间很小,上次我试图配置我的项目时,Visual Studio创建了2GB的文件,所以我想我还是改天再说吧:P@Magtheridon96:该XOR将翻转符号,但a)您甚至不知道是否需要修改输入(如果它已经为正),b)即使您这样做,该XOR也不会给出正确的值<代码>-1^0x8000…!=1
(在最常见的两个互补平台中)std::abs
会比针对
0x80000000000000
的异或运算快吗?@Magtheridon96可能不会。然而,
std::abs
是可移植的,而比特黑客则不是。@Magtheridon96
std::abs
将是可移植的。关于速度,我想说的是一样的:个人资料,自己看看。哦,好吧,便携性最终获胜。我想配置文件,但我的磁盘空间很小,上次我试图配置我的项目时,Visual Studio创建了2GB的文件,所以我想我还是改天再说吧:P@Magtheridon96:该XOR将翻转符号,但a)您甚至不知道是否需要修改输入(如果它已经为正),b)即使您这样做,该XOR也不会给出y
long long v; // value to abs()
long long const mask = v >> sizeof(long long) * CHAR_BIT - 1;

unsigned long long result = (v + mask) ^ mask;