为什么用“&1”检查负数

时间:2018-06-28 06:34:20

标签: c++ bit-manipulation

感谢您的快速回复。但是,不,这与评论中粘贴的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

我提交了第二个解决方案,其中更改为条件声明。看到一些改进,我感到很惊讶。我无法向自己解释这第二个条件为何起作用以及为什么它更快。

有人可以解释一下吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,考虑到所描述的问题,您的第二种算法根本不正确:

考虑值A == 10B == -12,则if子句中的第一个测试自然会失败,但是第二个也会失败(尽管它应该不是),因为A + B的所有位的位表示为但最低有效位设置为-2(提供了二进制补码)时计算为-2。

因此,在考虑性能之前,您应该首先考虑代码的正确性

如果现在考虑性能,则仅当基础硬件需要不同数量的CPU周期来计算AND操作和比较时,才可能有差异。我怀疑典型的现代硬件...即使存在有所不同(那么最有可能的比较需要更多的周期),编译器可能会自行决定将< 0优化为& 0x80000000(提供32位整数),结果完全相同两种变体的机器代码(假设您已解决第二个变体的错误!)。

如果您确实发现了最小的性能差异,则可能有很多完全不相关的原因可能使您迷惑,例如,由于传入的网络流量,测试系统变得更加活跃,另一个用户开始了另一个任务,.. 。在运行一个或另一个测试时就可以了。如果要获得绝对可靠的结果,则需要在密闭的系统(例如专用微控制器)上进行测试(而且结果仍然可以是如上所述的特定于硬件和编译器的!)。