Создать наименьшее уникальное число из двух байтов - PullRequest
3 голосов
/ 18 августа 2010

Как мы все знаем, диапазон байтов от 0 до 255
у меня есть два байта, я хочу создать другое число, которое является обратимым, но с минимальной длиной, которая объединяет эти два числа и создает новое, самое простое решение -

a = b1 * 1000 + b2

обратное будет

b1 = a / 1000
b2 =% 1000

длина вышеуказанного решения варьируется от 0 до 6, я хочу формулу с ИСПРАВЛЕНОЙ и минимальной длиной

Ответы [ 3 ]

5 голосов
/ 18 августа 2010

Код:

x = b1 * 256 + b2;
x = x + 10000;

Декодирование:

x = x - 10000;
b1 = x >> 8;
b2 = x & 255;

Кодированный результат всегда имеет длину 5 (10000 - 75535 включительно).А поскольку существует 65536 различных пар (b1, b2), их нельзя кодировать в числа длиной <5 (потому что таких номеров не более 10000). </p>

1 голос
/ 18 августа 2010

Если вы имеете в виду число фиксированной длины в десятичном виде, вы можете использовать:

a = 100,000 + b1 * 256 + b2

Это даст вам число от 100 000 до 165 535 включительно.

Чтобы отменить операцию:

b1 = (a - 100,000) / 256
b2 = (a - 100,000) % 256
1 голос
/ 18 августа 2010

Ну, самое простое решение общего назначения здесь будет

a = b1 * 256 + b2;

aka

a = (b1 << 8) | b2;

Затем, чтобы получить их обратно (при условии, что у вас есть неподписанные байты):

b1 = (a >> 8) & 0xff;
b2 = a & 0xff;

Это создаст 2-байтовое значение для всех входных данных, если только вы не сочтете, что результаты b1=0, b2=* равны одному байту (поскольку каждое значение меньше 256).Вы можете потенциально чередовать вещи, так что младшие четыре бита каждого входного байта заканчиваются младшими восемью битами вывода, так что вы получите значение менее 256 для (b1 < 16, b2 < 16).Честно говоря, проще всего всегда рассматривать его как 2-байтовое значение, используя вышеуказанное смещение.

Использование 2 байтов - это минимум, и это легко достижимо.

Если это не то, что выищите, пожалуйста, дайте больше информации.

РЕДАКТИРОВАТЬ: Я предполагал, что вы ищете фиксированную двоичную длину.Если вам нужна фиксированная десятичная длина, используйте решение фалагара.

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