【问题标题】:How do I compare upper 40 bits in two longs如何比较两个 long 中的高 40 位
【发布时间】:2013-09-09 18:35:08
【问题描述】:

我有一个标识无效输入的长值,它应该在高 40 位中包含 0。所以每次我得到一个新的输入时,我都要比较它的高 40 位,以验证它们是否为 0,以确保它不是无效的。

long invalid_id = 0;
long input ; //some input 

if ((input << 24) == id) {
   // invalid
}

这就够了吗?

【问题讨论】:

  • 你的意思是把“long invalid_id = 0;” ? “invalid”和“id”之间的空格可能会导致错误。
  • 你在正确的轨道上,但是......试着想象你的整数(在纸上)被写成 64 个 1 和 0 的二进制数。左 40 位是您要比较的高位。当您使用&lt;&lt; 时,这会将所有内容都移到 left(新的 0 出现在右侧),其中一些高位会从纸上掉下来。
  • 另外,如果invalid_id 是一个在整个程序中始终相同的常量,最好设为static final;您也可能希望将 INVALID_ID 设为大写,因为这是常量的常用约定。

标签: java bit-shift bits endianness


【解决方案1】:

您想使用右移运算符(有两个)并将值 右移

if ((input >>> 24) == 0) {
    // high-order 40 bits are all 0.
}

或者,您可以简单地使用以下方式进行位掩码:

if ((input & 0xFFFFFFFFFF000000L) == 0) {
    // high-order 40 bits are all 0.
}

请注意,&gt;&gt;&gt; 会将 0 置于高位,&gt;&gt; 将 0 置于正数,1 置于负数。

【讨论】:

    【解决方案2】:

    如果要检查两个 long 值的前 40 位是否相同

    long a, b;
    if (((a ^ b) >>> 24) == 0) // top 40 bits are the same.
    

    if (((a ^ b) & 0xFFFFFFFFFF00000000L) == 0)
    

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 2018-08-13
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多