Извините за неуклюжий заголовок;Я не смог найти способ выразить то, что я пытаюсь сделать.
Я получаю от пользователя ввод нескольких 32-битных целых чисел.Например, пользователь может ввести следующие значения (показаны в шестнадцатеричном виде для простоты объяснения):
0x00001234
0x00005678
0x0000abcd
В этом конкретном случае первые 2 байта каждого ввода являются постоянными, а последние 2 байта являютсяпеременная.В целях эффективности я мог бы хранить 0x0000
как одну константу и создать вектор значений uint16_t
для хранения переменной части ввода (0x1234
, 0x5678
, 0xabcd
).
Теперь предположим, что пользователь вводит следующее:
0x00000234
0x56780000
0x00001000
В этом случае мне понадобится вектор значений uint32_t
для хранения переменной части ввода, поскольку каждое значение влияет на разные байты.
Моя текущая мысль состоит в том, чтобы сделать следующее:
uint32_t myVal = 0;
myVal |= input1;
myVal |= input2;
// ...
И затем в конце найти расстояние между первым и последним битом "переключенным" (т. Е. 1
) в myVal
.Это расстояние даст мне требуемый размер поля для переменной части всех входов.
Однако это не похоже на то, как если бы оно подходило для большого количества пользовательских входов.Какие-нибудь рекомендации относительно элегантного и эффективного способа определения этого?
Обновление:
Я упростил проблему в своем объяснении выше.
Просто чтобы прояснить, я делаю это не для экономии памяти (у меня есть более важные вещи, чем попытка сэкономить несколько байтов, и это не для целей оптимизации).
Таким образом, компонент A обеспечиваетКомпонент B в моей системе со значениями.Иногда эти значения являются 128-битными, но компонент B поддерживает только 32-битные значения.
Если переменная часть 128-битного значения может быть выражена 32-битным значением, я могу принять это.В противном случае мне придется отклонить его с ошибкой.
Я не в состоянии изменить компонент B, чтобы разрешить 128-битные значения, или изменить компонент A, чтобы предотвратить его использование 128-битных значений (тамаппаратные ограничения здесь тоже).