感谢您的快速回复。但是,不,这与评论中粘贴的AND按位操作问题不同。那是我最初的想法。 “&1”应该只是检查整数是否为奇数或偶数。而且我还了解,使用AND运算的常规方式是比较有效位,这是通过类似以下操作完成的:
if((A+B >> 31) &1)
我还尝试重新表述问题和示例代码,以使内容更清楚。另外,这里是问题的链接:Target Sum。
当我尝试针对LeetCode问题重构代码时,遇到了这个问题。问题是要比较一个正整数是否小于另一个整数的绝对值。这是我的操作方法:(我知道有一个 abs()函数,但更喜欢 NOT 使用它)
if(A < B || A+B < 0)
// do something
其中 A 是不超过1000的正整数, B 可以是任何32位整数。但是,我看到其他解决方案比我做的还要快:
if(A<B || (A+B &1))
// do something
我提交了第二个解决方案,其中仅更改为条件声明。看到一些改进,我感到很惊讶。我无法向自己解释这第二个条件为何起作用以及为什么它更快。
有人可以解释一下吗?任何帮助将不胜感激。
答案 0 :(得分:1)
首先,考虑到所描述的问题,您的第二种算法根本不正确:
考虑值A == 10
,B == -12
,则if子句中的第一个测试自然会失败,但是第二个也会失败(尽管它应该不是),因为A + B
的所有位的位表示为但最低有效位设置为-2(提供了二进制补码)时计算为-2。
因此,在考虑性能之前,您应该首先考虑代码的正确性!
如果现在考虑性能,则仅当基础硬件需要不同数量的CPU周期来计算AND操作和比较时,才可能有差异。我怀疑典型的现代硬件...即使存在是有所不同(那么最有可能的比较需要更多的周期),编译器可能会自行决定将< 0
优化为& 0x80000000
(提供32位整数),结果完全相同两种变体的机器代码(假设您已解决第二个变体的错误!)。
如果您确实发现了最小的性能差异,则可能有很多完全不相关的原因可能使您迷惑,例如,由于传入的网络流量,测试系统变得更加活跃,另一个用户开始了另一个任务,.. 。在运行一个或另一个测试时就可以了。如果要获得绝对可靠的结果,则需要在密闭的系统(例如专用微控制器)上进行测试(而且结果仍然可以是如上所述的特定于硬件和编译器的!)。