LINUX.ORG.RU

История изменений

Исправление 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;

}

http://ideone.com/m4iFS3

Гусарам: да, я знаю про 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;

}

http://ideone.com/m4iFS3

Гусарам: да, я знаю про 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;

}

http://ideone.com/m4iFS3

Гусарам: да, я знаю про 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;

}

http://ideone.com/m4iFS3