代码之家  ›  专栏  ›  技术社区  ›  user2961927

按段比较64位整数

  •  2
  • user2961927  · 技术社区  · 7 年前

    我有两个64位整数 x y . 每一位代表5个短无符号整数:前10位代表第一个整数,后13位代表第2个整数,后16位代表第3个整数,后14位代表第4个整数,其余位代表第5个整数。

    x0 , x1 , x2 , x3 , x4 是构成 X . 让 y0 , y1 , y2 , y3 , y4 是构成 Y . 我想知道 x0 < y0 x1 < y1 x2 < y2 x3 < y3 x4 < y4 .

    我认为最简单的解决方案是转移:

    bool allLess(std::size_t x, std::size_t y)
    {
      if(x >= y) return 0;
      int shift[] = {10, 13, 16, 14};
      for(int i = 0; i < 4; ++i)
      {
        x <<= shift[i];
        y <<= shift[i];
        if(x >= y) return 0;
      }
      return 1;
    }
    

    我知道有很多按位的体操。有更快的解决方案吗?

    谢谢您!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Aleksi Torhamo    7 年前

    这并不能真正回答所提出的问题,而是解决了一个非常类似的问题:(如果一个人能够重新组织实际的问题,比如op,这可能会有帮助)

    如果整数没有被紧密地压缩(即如果每个“字段”和msb结尾之间有一个0位的填充),并且您想知道 <= 而不是 < ,我想您可以直接减去这些数字,然后检查是否有填充位发生了变化。(I. (y - x) & PADDING_MASK )