2010-08-18 3 views
3

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

а = b1 * 1000 + b2

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

b1 = а/1000
b2 = а% 1000

длиной выше раствора изменяющегося от 0 до 6 длины, я хочу формулу с FIXED и минимальной длиной

ответ

4

Зашифруйте:

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

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

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

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

+0

D'Oh. Мое решение, но с одной меньшей цифрой. Я не знаю, как это могло ускользнуть от меня. +1. – paxdiablo

+0

Ваше решение замечательно, есть ли какой-нибудь более мелкий? например, 4 цифры с какой-то сложной формулой? – Ehsan

+1

@Ehsan: Как может быть 4 цифры, когда имеется 65536 различных входных значений? –

1

Ну самое простое общее решением цели здесь будет

a = b1 * 256 + b2; 

аки

a = (b1 << 8) | b2; 

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

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

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

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

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

EDIT: Я предполагаю, что вы ищете фиксированную двоичную длину. Если вы хотите фиксированную длину десятичной длины, используйте решение falagar.

1

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

a = 100,000 + b1 * 256 + b2 

Это даст вам число от 100000 до 165535 включительно.

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

b1 = (a - 100,000)/256 
b2 = (a - 100,000) % 256 
+0

Решение falagar дает меньший фиксированный размер. –

+0

Да, я должен быть старческим :-) – paxdiablo

Смежные вопросы