Ну самое простое общее решением цели здесь будет
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.
D'Oh. Мое решение, но с одной меньшей цифрой. Я не знаю, как это могло ускользнуть от меня. +1. – paxdiablo
Ваше решение замечательно, есть ли какой-нибудь более мелкий? например, 4 цифры с какой-то сложной формулой? – Ehsan
@Ehsan: Как может быть 4 цифры, когда имеется 65536 различных входных значений? –