【问题标题】:C++: What do these bitwise AND's and following comparisons do?C ++:这些按位与和以下比较有什么作用?
【发布时间】:2015-03-09 22:01:55
【问题描述】:

我目前正在执行使用两个堆查找中值的实现: No. 30 - Median in Stream

我了解一般的基本算法,但我不确定这个确切的实现是如何工作的。具体来说,我对这两行的作用感到非常困惑:

if(((minHeap.size() + maxHeap.size()) & 1) == 0)
....
if(size & 1 == 1)

我相信我理解按位与 - 它需要两个数字并以二进制形式输出一个数字。通过比较 == 0 或 == 1,它会逐位检查按位与是否分别输出 0 或 1。但是,在寻找中位数的情况下,这到底是做什么的?我知道保持堆“均匀”(并将中位数保持在两个堆之间)很重要,但除此之外我不完全确定。这真的只是一种检查尺寸是否不同的方法吗?

【问题讨论】:

  • x&1x%2 一样,都是检查x 是偶数还是奇数。
  • x & (n - 1) = x % n 其中n 是二的幂。
  • @tux3 - 是的,但请记住不要对有符号整数使用此技巧,因为“二的恭维”,逻辑会反转负数
  • @iwolf:负数的逻辑是如何反转的?例如,在 2 的补码中,-7 & 11。而-7 % 2 非零。
  • @MDragon00:永远不要使用if(size & 1 == 1)!这意味着if(size & (1 == 1))。诚然,在这种情况下,这也是同样的事情;但只是偶然。

标签: c++ algorithm median


【解决方案1】:

如果最低位为零,即总和为偶数,我相信第一个测试是正确的。如果 size 为奇数(即设置了 LSB),则第二个测试为真。

【讨论】:

  • 所以比较只检查最低有效位,还是我在这里仍然遗漏了什么?
  • & 是以 0x0000001 作为右操作数的按位与运算,即左操作数只有一个 LSB 位很重要。
  • 谢谢,出于某种原因,我一直认为它是在两种尺寸之间进行二进制与。您的澄清帮助很大。
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2019-05-17
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多