【问题标题】:What is the difference between -1 and ~0-1 和 ~0 有什么区别
【发布时间】:2011-07-18 14:14:06
【问题描述】:

标题确实说明了一切:减一和 tilda (ones-complement) 零有什么区别?

在讨论指定设置所有位的位掩码的最佳方法时,出现了这个问题。以下哪个更好?

int func(int value, int mask = -1) {
    return (value & mask);
}

int func(int value, int mask = ~0) {
    return (value & mask);
}

有没有其他用途可以反其道而行之?

更新:在stackoverflow.com/q/809227/34509 上也有关于这个主题的类似讨论,我在之前的研究中错过了这个讨论。感谢 Johannes Schaub 指出这一点。

【问题讨论】:

  • 这是从什么时候开始的java?
  • 诚然,我在编写示例时正在考虑 C++,但问题最初是在使用 java 时出现的。
  • 如果“最好”是指“最易读”,那么它们都很糟糕。 0xFFFFFFFF 有什么问题?
  • 0xFFFFFFFF 假设 int 是 32 位宽,但不一定如此。

标签: c++ bitmask ones-complement


【解决方案1】:

第一个变体依赖于负数的 2 的补码表示,这不一定是使用的。也可以使用 1 的补码……或其他编码。我的投票是第二种方法

【讨论】:

  • 好的,有道理。老实说,什么架构仍然使用除 2 的补码以外的任何东西?而且我相信java实际上保证了它?
  • JVM 确实保证 int 类型是 32 位二进制补码数。
  • 我认为两者都依赖于二进制补码(如果您使用int)。我们之前有过这个问题stackoverflow.com/q/809227/34509。特别是,~0 最终可能是值0,在这种情况下,它在存储时可能最终全为零。仅在二进制补码上,~0 的生成位模式将标识唯一值 (-1),而不是具有两种可能表示形式(负/正零)的单个值。所以我认为唯一的可移植方式是使用unsigned int 并将-1 分配给它。
【解决方案2】:

第二个示例更清楚地说明了您要测试的内容。

【讨论】:

    【解决方案3】:

    两者都是一样的。除此之外,-1unsigned int 配合得很好,没有警告。

    【讨论】:

      猜你喜欢
      • 2019-09-04
      • 2011-12-24
      • 1970-01-01
      • 2010-10-15
      • 2021-12-20
      • 1970-01-01
      • 2016-03-23
      • 2021-06-16
      相关资源
      最近更新 更多