可以说我们有一个负整数说int a;
是否有更快的-a实现?
我必须对此进行一些按位操作吗?
几乎可以肯定没有什么比机器代码NEG指令更快,你的编译器很可能会把它变成.
如果有的话,我确信编译器会使用它.
对于二进制补码数,你不能加1,但这几乎肯定会慢一点.但我并不完全确定C/C++标准要求使用二进制补码(他们可能,我没有检查).
我认为这个问题属于那些试图重写strcpy()
等人以获得更快速度的问题.那些人天真地认为C库strcpy()
尚未通过使用特殊的机器代码指令进行大量优化(而不是大多数人第一次尝试的简单循环).
您是否进行过性能测试,这些测试似乎表明您的否定需要花费相当长的时间?
<含蓄幽默,或 - 什么 - 我的妻子通话,无趣>
486上的NEG(最后一次我不得不担心时钟周期的现状)需要3个时钟周期(存储器版本,寄存器只需1个) - 我假设后面的芯片将是相似的.在3Ghz CPU上,这意味着您每秒可以完成10亿次这样的操作.这不够快吗?
含蓄幽默,或 - 什么 - 我的妻子通话,无趣>
你有没有听过"过早优化"这个短语?如果你已经优化了所有代码,这是唯一剩下的,很好.如果没有,你就是在浪费时间.
澄清Pax的陈述,
除1例外,C++编译器不强制使用二进制补码.将有符号类型转换为无符号类型时,如果数字为负数,则转换结果必须是整数的2的补码表示.
简而言之,没有比-a更快的方法; 即使有,它也不会便携.请记住,过早优化是邪恶的.首先描述您的代码,然后解决瓶颈问题.
参见The C++ Programming Language,3rd Ed.,C.6.2.1节.