История изменений
Исправление KennyMinigun, (текущая версия) :
Всё зависит от «алфавита», который надо закодировать.
Например, если есть алфавит 0, 1, 2 .. 9, его мощность (обьем) равен 10, его можно закодировать в:
>>> math.ceil(math.log(10, 2))
4.0
... 4 битах.
Обычно в С++ размер int == 4 байта, но для уверенности будем использовать int32_t. В 32 битах можно уместить 8 «букв» нашего «алфавита», но для простоты примера будет лишь 4.
#include <iostream>
#include <cstdint>
using namespace std;
int32_t encode(int32_t a, int32_t b, int32_t c, int32_t d) {
return (a << 12) + (b << 8) + (c << 4) + d;
}
void decode(int32_t value, int32_t *result) {
const int32_t mask = 0xf;
result[0] = (value >> 12) & mask; // a
result[1] = (value >> 8) & mask; // b
result[2] = (value >> 4) & mask; // c
result[3] = value & mask; // d
}
int main() {
int32_t result[] = {0, 0, 0, 0};
int32_t encoded = encode(6, 4, 2, 9);
decode(encoded, result);
cout << "a: " << result[0] << endl
<< "b: " << result[1] << endl
<< "c: " << result[2] << endl
<< "d: " << result[3] << endl;
return 0;
}
Гусарам: да, я знаю про std::make_tuple
Исправление KennyMinigun, :
Всё зависит от «алфавита», который надо закодировать.
Например, если есть алфавит 0, 1, 2 .. 9, его мощность (обьем) равен 10, его можно закодировать в:
>>> math.ceil(math.log(10, 2))
4.0
... 4 битах.
Обычно в С++ размер int == 4 байта, но для уверенности будем использовать int32_t:
#include <iostream>
#include <cstdint>
using namespace std;
int32_t encode(int32_t a, int32_t b, int32_t c, int32_t d) {
return (a << 12) + (b << 8) + (c << 4) + d;
}
void decode(int32_t value, int32_t *result) {
const int32_t mask = 0xf;
result[0] = (value >> 12) & mask; // a
result[1] = (value >> 8) & mask; // b
result[2] = (value >> 4) & mask; // c
result[3] = value & mask; // d
}
int main() {
int32_t result[] = {0, 0, 0, 0};
int32_t encoded = encode(6, 4, 2, 9);
decode(encoded, result);
cout << "a: " << result[0] << endl
<< "b: " << result[1] << endl
<< "c: " << result[2] << endl
<< "d: " << result[3] << endl;
return 0;
}
Гусарам: да, я знаю про std::make_tuple
Исправление KennyMinigun, :
Всё зависит от «алфавита», который надо закодировать.
Например, если есть алфавит 0, 1, 2 .. 9, его мощность (обьем) равен 10, его можно закодировать в:
>>> math.ceil(math.log(10, 2))
4.0
... 4 битах.
Обычно в С размер int == 4 байта, но для уверенности будем использовать int32_t:
#include <iostream>
#include <cstdint>
using namespace std;
int32_t encode(int32_t a, int32_t b, int32_t c, int32_t d) {
return (a << 12) + (b << 8) + (c << 4) + d;
}
void decode(int32_t value, int32_t *result) {
const int32_t mask = 0xf;
result[0] = (value >> 12) & mask; // a
result[1] = (value >> 8) & mask; // b
result[2] = (value >> 4) & mask; // c
result[3] = value & mask; // d
}
int main() {
int32_t result[] = {0, 0, 0, 0};
int32_t encoded = encode(6, 4, 2, 9);
decode(encoded, result);
cout << "a: " << result[0] << endl
<< "b: " << result[1] << endl
<< "c: " << result[2] << endl
<< "d: " << result[3] << endl;
return 0;
}
Гусарам: да, я знаю про std::make_tuple
Исходная версия KennyMinigun, :
Простенький пример
Всё зависит от «алфавита», который надо закодировать.
Например, если есть алфавит 0, 1, 2 .. 9, его мощность (обьем) равен 10, его можно закодировать в:
>>> math.ceil(math.log(10, 2))
4.0
... 4 битах.
Обычно в С размер int == 4 байта, но для уверенности будем использовать int32_t:
#include <iostream>
#include <cstdint>
using namespace std;
int32_t encode(int32_t a, int32_t b, int32_t c, int32_t d) {
return (a << 12) + (b << 8) + (c << 4) + d;
}
void decode(int32_t value, int32_t *result) {
const int32_t mask = 0xf;
result[0] = (value >> 12) & mask; // a
result[1] = (value >> 8) & mask; // b
result[2] = (value >> 4) & mask; // c
result[3] = value & mask; // d
}
int main() {
int32_t result[] = {0, 0, 0, 0};
int32_t encoded = encode(6, 4, 2, 9);
decode(encoded, result);
cout << "a: " << result[0] << endl
<< "b: " << result[1] << endl
<< "c: " << result[2] << endl
<< "d: " << result[3] << endl;
return 0;
}