按段比较64位整数

时间:2018-06-03 04:29:59

标签: c++ bit-manipulation

我有两个64位整数java.lang.IllegalArgumentException: baseUrl must end in /: http://10.0.2.2/database_apix。它们中的每一个代表5个短无符号整数:前10位代表第一个整数,接下来的13位代表第2个整数,接下来的16位代表第3个整数,接下来的14位代表第4个整数,其余位代表第5个整数。

yx0x1x2x3为构成x4的5个短整数。让xy0y1y2y3为构成y4的5个短整数。我需要知道yx0 < y0以及x1 < y1x2 < y2以及x3 < y3

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

x4 < y4

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

如果整数没有紧密排列(即,如果每个&#34;字段&#34;和MSB端之间只有一个零位填充),并且您想知道{{ 1}}而不是<=,我想你可能只需减去数字并检查是否有任何填充位发生了变化。 (即<

答案 1 :(得分:0)

您可以使用位字段

#include <iostream>
#include <string.h>
#include <stdint.h>

struct CombInt64 {
        CombInt64(uint64_t x) {
                memcpy(this, &x, sizeof(uint64_t));
        }

        bool operator < (const CombInt64& other) const {
                std::cout << "Debug: self.a: " << a << " other.a: " << other.a << std::endl;
                std::cout << "Debug: self.b: " << b << " other.b: " << other.b << std::endl;
                std::cout << "Debug: self.c: " << c << " other.c: " << other.c << std::endl;
                std::cout << "Debug: self.d: " << d << " other.d: " << other.d << std::endl;
                std::cout << "Debug: self.e: " << e << " other.e: " << other.e << std::endl;

                return a < other.a && b < other.b && c < other.c && d < other.d && e < other.e;
        }
#if __BYTE_ORDER == __LITTLE_ENDIAN
        uint64_t a:10;
        uint64_t b:13;
        uint64_t c:16;
        uint64_t d:14;
        uint64_t e:11;
#elif __BYTE_ORDER == __BIG_ENDIAN
        uint64_t e:11;
        uint64_t d:14;
        uint64_t c:16;
        uint64_t b:13;
        uint64_t a:10;
#endif
};

bool allLess(uint64_t x, uint64_t y) {
        return CombInt64(x) < CombInt64(y);
}

int main(void) {
        std::cout << allLess(123, 45) << std::endl;
}

输出

[root@localhost tmp]# ./a.out
Debug: self.a: 123 other.a: 45
Debug: self.b: 0 other.b: 0
Debug: self.c: 0 other.c: 0
Debug: self.d: 0 other.d: 0
Debug: self.e: 0 other.e: 0
0

未经过全面测试!