LINUX.ORG.RU

Несколько вариантов переменной в одной переменой


0

3

Вопрос алгоритмический, существует ли формула применяя которую можно из одного значения вычислить несколько других и нооборот несколько значений преобразовать в одно.

К примеру: выбранны числа 1,8,9 преобразовываем например в 38436424424 (цифра с потолка можно и буквинное значение) а потом из 38436424424 вычислить значение 1,8,9

как вы понимаете 1,8,9 это может быть любое цифровое значение как и по количеству так и по величене сумме.

з.ы. просто что бы не использовать несколько ячейк для хранения параметров, пытаюсь все пораметры преобразоват в одно значение и сохранить в одной ячейки.


Самый простой способ — часть бит под одно число, часть под другое. RGB/RGBA цвета так и хранят.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Там ограниценно число переменных. Кстати вконтакте там когда настрайваешь выбор - какойто алгорит преобразования используется все long int превращается.

Roman_S
() автор топика

К примеру: выбранны числа 1,8,9 преобразовываем например в 38436424424 (цифра с потолка можно и буквинное значение) а потом из 38436424424 вычислить значение 1,8,9

Т.е. тебе надо установить биекцию между различными представлениями твоих значений? В общем случае это невозможно.

з.ы. просто что бы не использовать несколько ячейк для хранения параметров, пытаюсь все пораметры преобразоват в одно значение и сохранить в одной ячейки.

Теперь хорошенько подумай, так уж ли это необходимо?

theNamelessOne ★★★★★
()
Ответ на: комментарий от Roman_S

Кстати вконтакте там когда настрайваешь выбор - какойто алгорит преобразования используется все long int превращается.

Что?

theNamelessOne ★★★★★
()
Ответ на: комментарий от PolarFox

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

Roman_S
() автор топика
Ответ на: комментарий от Roman_S

Который преобразует все выбранные переменные в один числитиль, а потом из него можно получить не только эти переменные и применить поиск - если необходимо найти одну из переменных.

При регистрации в базе сохраняются все эти переменные, этому набору переменных присваивается какой-нибудь уникальный идентификатор. Потом при том же поиске просто берутся переменные по этому идентификатору. Никакой магии.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Roman_S

Если их больше 10ти - это же сколько получится каких-нибудь уникальных идентификатор.

Кого больше? Переменных? Один.

theNamelessOne ★★★★★
()

Вопрос алгоритмический, существует ли формула применяя которую можно из одного значения вычислить несколько других и нооборот несколько значений преобразовать в одно.

Хоть две. Только тебе придётся определится с максимальным числом, которое можно выбрать. Например от 0 до 9. Или от 0 до 100500.

anonymous
()
Ответ на: комментарий от theNamelessOne

Переменных которые приобразуются в одну. Все нашёл я другой способ, запихнуть все в одну переменную, с возможностью быстрого поиск - без всяких индификаторов и прочих баласта.

Roman_S
() автор топика
Ответ на: комментарий от Roman_S

Все нашёл я другой способ, запихнуть все в одну переменную, с возможностью быстрого поиск - без всяких индификаторов и прочих баласта.

Молодец!

theNamelessOne ★★★★★
()

man кодирование, если я правильно понял вопрос.

Deleted
()

Да можно. если они вмещаются.

Мой упоротый путь для такого – выбрать основание системы счисления так, чтобы в каждом разряде помещалось твоё число. Дальше преобразуешь и наслаждаешься.

anonymous
()

Простенький пример

Всё зависит от «алфавита», который надо закодировать.

Например, если есть алфавит 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 ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 3)
Ответ на: комментарий от theNamelessOne

Вот что дает ЕГЭ по информатике... спасибо что хоть над гусями не глумиться.

AIv ★★★★★
()

А вот и цирк приехал! Неисчерпаемы запасы клоунов, царя и баттю убрали, так на их место десяток новых набежит.

anonymous
()
Ответ на: комментарий от dvl36

Да там вообще баг — маску надо еще наложить :)

.. хотя, может UD в случае передачи невалидных символов алфавита это не так уж плохо

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Каждое твоё значение состоит из бит. Ты можешь взять контейнер и выделить биты в нём для хранения бит каждого из входных значений произвольным образом. Как уже сказали, можешь выделить фиксированное количество бит на каждый вход [aaaaaaaabbbbbbbbcccccccc] (тогда, расширяя контейнер, можно будет хранить больше переменных). Либо можешь чередовать биты [abcabcabcabcabcabcabcabc] (тогда расширяя контейнер, сможешь хранить переменные большего размера).

slovazap ★★★★★
()

это индекс или указатель

anonymous
()
Ответ на: комментарий от KennyMinigun

Да там вообще баг

Это не страшно. Главное чтоб код был красивый. :) А эти плюсы, вместо пайпов, они же все портят. :)

dvl36
()

Union-ы сюда просятся, union-ы. Та конструкция pure C, про существование которой, в наше время, часто забывают.

typedef union {
    byte_t byte;
    struct {
        unsigned int D1:4; /* */
        unsigned int F1:4; /* */
    } bits;
} TA1_union;
Вообщем гугли union-ы, это то что тебе нужно.

dvl36
()

К примеру возьмём абстрактно десятки, сотни, тысячи и так далее в каждой паре можем хранить по 1 значению скажем число 332266558899 для нас может быть не как просто число, а как несколько значений 33, 22, 66 и так далее, просто меняем или берём значения из/в переменной в соотвецтвии степени числа.

Можно накалякать простую функцию на С которая это реализует.

А если значения булевые 1 or 0 то можно битами рулить, тогда вообще простор для творчества огромен.

Но по моему тебе нужно просто использовать массивы.

blogdron
()

К примеру: выбранны числа 1,8,9 преобразовываем например в 38436424424 (цифра с потолка можно и буквинное значение) а потом из 38436424424 вычислить значение 1,8,9

концепт: использовать числовой разделитель и записать последовательность чисел

1,8,9 => 10809

10809 => 1,8,9

или так:

1,8,9 => 123112381239

123112381239 => 1,8,9

swwwfactory ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.