c++ - 按段比较 64 位整数

标签 c++ bit-manipulation swar

我有两个 64 位整数 xy .每一位代表5个无符号短整数:前10位代表第一个整数,接下来的13位代表第二个整数,接下来的16位代表第三个整数,接下来的14位代表第四个整数,其余位代表第 5 个整数。

x0 , x1 , x2 , x3 , x4是构成x的5个短整数.让y0 , y1 , y2 , y3 , y4是构成y的5个短整数.我需要知道 x0 < y0x1 < y1x2 < y2x3 < y3x4 < 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;
}

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

最佳答案

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

如果整数没有紧密排列(即如果每个“字段”之间和 MSB 末尾有单个零位填充),并且您想知道 <=而不是 < ,我认为您可以只减去数字并检查是否有任何填充位发生变化。 (即 (y - x) & PADDING_MASK)

关于c++ - 按段比较 64 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50663315/

相关文章:

java - 通过位操作更快地实现 Math.abs()

java - 一条语句中的多个按位移位

C 按位循环移位 - 意外结果

optimization - 这种并行处理颜色分量的颜色混合技巧是如何工作的?

c++ - 以二进制方式将utf16写入文件

c++ - libevent evhttp 和 ipv6

c++ - 实现可被接受为 std::ostringstream 引用的无操作 std::ostringstream

c++ - CodeBlocks为32位计算机编译程序