Сравните 64-битные целые по сегментам - PullRequest
0 голосов
/ 03 июня 2018

У меня есть два 64-битных целых числа x и y.Каждое из них представляет 5 коротких целых без знака: первые 10 бит представляют первое целое число, следующие 13 бит представляют второе целое число, следующие 16 бит представляют третье целое число, следующие 14 бит представляют четвертое целое число, а остальные биты представляют5-е целое число.

Пусть x0, x1, x2, x3, x4 - 5 коротких целых чисел, составляющих x.Пусть y0, y1, y2, y3, y4 будут 5 короткими целыми числами, составляющими 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;
}

Iзнаю, что есть много побитовой гимнастики.Есть более быстрое решение?

Спасибо!

1 Ответ

0 голосов
/ 03 июня 2018

Это на самом деле не отвечает на поставленный вопрос, но решает очень похожую проблему: (которая может помочь, если кто-то может реорганизовать реальную проблему, как ОП)

Если целые числане были плотно упакованы (т. е. если бы между каждым "полем" и в конце MSB был один нулевой бит заполнения), и вы хотели знать <= вместо <, я думаю, вы могли быпросто вычесть числа и проверить, изменился ли какой-либо из битов заполнения.(т.е. (y - x) & PADDING_MASK)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...