Как найти 16 в числе 356? В исчислении 1,2,4,8,16,32 и т.д
| |
alexsilent | Дата: Суббота, 02 Мая 2015, 20:28 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Приветствую друзья. У меня немного специфический вопрос. Как найти 16 в числе 356 к примеру?! В исчислении 1,2,4,8,16,32 и т.д (не знаю, как это всё называется, я просто точно знаю что если эти числа суммировать, то всегда можно узнать какие числа были суммированы, то есть они уникальны, но на этом моя теория заканчивается)
Мне это нужно для сохранения уникальных апгрейдов лагеря, который можно прокачивать.
К примеру: 1 - костёр, 2 - палатка, 4 - часы, 8 - алхимический стол и т.д. и их сумма покажет одним числом, какие апгрейды есть в этом лагере. К примеру число 10 показывает что в лагере только = палатка (2) + алхимический стол (8).
Полазил по сайтам программистов и там слишком заумно. слишком много терминологии, я дизайнер, а не программист, у меня голова от наплыва информации едет и всё на английском)
Кто-то может простым примером и русским языком объяснить, как правильно находить такое уникальное число в сумме?
То есть я совсем не понимаю, что мне нужно написать, чтобы узнать, есть ли число 16 в числе 356? Или в любом другом.
Другими словами есть ли какой-то специальный оператор или нужно самому функцию писать?
Извините за каламбур, из-за того что я не силён в терминологии, надеюсь меня смогли понять!
Сообщение отредактировал alexsilent - Суббота, 02 Мая 2015, 20:46 |
|
| |
harmoxyne | Дата: Суббота, 02 Мая 2015, 20:43 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Подозреваю, что самый простой способ - разложить на уникальные слогаемые, и проверить, есть ли уже там нужно нам число. Может быть (не могу быть уверен и проверить) что-то в таком стиле сработает: Код bool IsNumberInside(int number, int sum) { for(int i = 1; i < sum; i*2) { if(i == number) return true; } return false; }
Но сработает при условии, что все куплено линейно.
Сообщение отредактировал harmoxyne - Суббота, 02 Мая 2015, 20:45 |
|
| |
EfimovMax | Дата: Суббота, 02 Мая 2015, 20:46 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Интересная задачка Пока только надумал такой вариант - искать ближайшее "волшебное" меньшее число (кои у нас заранее забиты в массивы). Например, есть 34. Циклом отнимаем из него по единице. Останавливаем цикл на "волшебном" числе. То есть - 32. Вычитаем из 34 двойку, получаем значения 32 и2. Профит Может не так красиво, но это должно работать.
Текущий проект: The Experiment ☭
Выпущенные проекты Steam: Princess.Loot.Pixel.Again Princess.Loot.Pixel.Again x2 Dungetris
Сообщение отредактировал EfimovMax - Суббота, 02 Мая 2015, 20:47 |
|
| |
alexsilent | Дата: Суббота, 02 Мая 2015, 20:52 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| я пока вот такую топорную функцию написал, кажется работает... всего лишь нужно узнать за один заход одну нужную переменную. написано на Яваскрипте
BigNumber - это сумма из которой надо найти уникальное число и NeedNumber - нужное уникальное число
Код // проверка битов 1/2/4/8/16/32/64/128 function CheckByte(BigNumber : int,NeedNumber : int) : boolean { if (BigNumber >= 256) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 256;} if (BigNumber >= 128) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 128; } if (BigNumber >= 64) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 64; } if (BigNumber >= 32) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 32; } if (BigNumber >= 16) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 16; } if (BigNumber >= 8) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 8; } if (BigNumber >= 4) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 4; } if (BigNumber >= 2) { if (NeedNumber == BigNumber) { return true; } BigNumber -= 2;} if (BigNumber >= 1) { if (NeedNumber == BigNumber) { return true; } } return false; }
но скорее всего математики и программисты отбивают себе дикие фейспалмы) после того как я её написал, подумал что должен быть проще способ
Сообщение отредактировал alexsilent - Суббота, 02 Мая 2015, 20:56 |
|
| |
MANMANA | Дата: Суббота, 02 Мая 2015, 20:55 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| а ты кинь ссылку на странице, где обсуждается то, что ты ищешь, а мы тебе
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
alexsilent | Дата: Суббота, 02 Мая 2015, 21:09 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Цитата EfimovMax ( ) Интересная задачка Пока только надумал такой вариант - искать ближайшее "волшебное" меньшее число (кои у нас заранее забиты в массивы). Например, есть 34. Циклом отнимаем из него по единице. Останавливаем цикл на "волшебном" числе. То есть - 32. Вычитаем из 34 двойку, получаем значения 32 и2. Профит Может не так красиво, но это должно работать.
Да, пока это единственный вариант, который приходит в голову!
|
|
| |
MANMANA | Дата: Суббота, 02 Мая 2015, 21:12 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| а так? int power;
power = (int)Math.Log(BigNumber,2);//находим степень и отбрасываем дробное needNumber = Math.Pow(2, power));//возводим 2-ку в найденную степень
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
harmoxyne | Дата: Суббота, 02 Мая 2015, 21:12 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| alexsilent, вот нашел кое-что, посмотри, может подтолкнет на мысли
|
|
| |
MANMANA | Дата: Суббота, 02 Мая 2015, 21:12 | Сообщение # 9 |
почти ветеран
Сейчас нет на сайте
| p.s. не тестил. на бумажке написал
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
|
|
| |
harmoxyne | Дата: Суббота, 02 Мая 2015, 21:16 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| MANMANA, не, вряд ли. Возьмем, к примеру, комбинацию 1, 2, 8, 16, 256. В сумме 283. Логарифм дает нам 8 с крюком. Если поднесем двойку к этой степени - получим 256. Но что с ним дальше делать? Мы не сможем проверить, было ли там 16 в сумме, или нет.
|
|
| |
beril | Дата: Суббота, 02 Мая 2015, 21:31 | Сообщение # 11 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Посмотри это тык
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Zenext | Дата: Воскресенье, 03 Мая 2015, 16:43 | Сообщение # 12 |
был не раз
Сейчас нет на сайте
| Цитата alexsilent ( ) слишком много терминологии, я дизайнер, а не программист Изощрился так изощрился)
Цитата MANMANA ( ) наговнокодим :) Держите) https://jsfiddle.net/Zenext/ob79p5cj/ Накидал по бырому на js. Результат в консоли.
Сообщение отредактировал Zenext - Воскресенье, 03 Мая 2015, 17:15 |
|
| |
argc | Дата: Воскресенье, 03 Мая 2015, 17:43 | Сообщение # 13 |
был не раз
Сейчас нет на сайте
| var a = 20; var b = 16; console.log( a & b ? 'a содержит b' : 'a не содержит b' );
|
|
| |
черная_тень | Дата: Воскресенье, 03 Мая 2015, 17:44 | Сообщение # 14 |
Flash-любитель
Сейчас нет на сайте
| Может я не совсем понял проблему, но может просто поробовать расписать все через степень двойки минус один?
16 = 2^4-1 + 2^1-1 -> сумма покажет, что игрока предмет номер 16 и 2 10 = 2^3 - 1 + 2^2 - 1 -> у игрока предметы н.8 и н.4, которые в сумме дают 10
Возможно, что бред, но кто знает, как это можно интерпретировать. Во всяком случае, интересно узнать решение прооблемыДобавлено (03 мая 2015, 17:44) --------------------------------------------- Может я не совсем понял проблему, но может просто поробовать расписать все через степень двойки минус один?
16 = 2^4-1 + 2^1-1 -> сумма покажет, что игрока предмет номер 16 и 2 10 = 2^3 - 1 + 2^2 - 1 -> у игрока предметы н.8 и н.4, которые в сумме дают 10
Возможно, что бред, но кто знает, как это можно интерпретировать. Во всяком случае, интересно узнать решение прооблемы
I am back, boyz
|
|
| |
divol13 | Дата: Воскресенье, 03 Мая 2015, 18:43 | Сообщение # 15 |
участник
Сейчас нет на сайте
| элементарно
К примеру: 1 - костёр, 2 - палатка, 4 - часы, 8 - алхимический стол
число в двоичном виде представляет собой степени двойки, вот к слову, откуда берется такой ряд 1,2,4,8,16,32 ...
2^1|2^2|2^3|2^4
отбросим к чертям степени, напишем просто результаты и под ними предмет - есть(y) или нет(n)
1|2|4|8 y|n|y|n
из этого выходит, что есть костер(1) и часы(4) как правило вместо y/n используются 1/0 - для компа так удобнее
а еще для компа удобнее делать это наоборот, то есть увеличивать цифры не направо, а налево, вот так 8|4|2|1 то есть следующее число (16) будет слева 16|8|4|2|1
таким образом все что нам необходимо это разложить число 356 на двоичное число 101100100
где 1- в разряде будет давать нам инфу что этот предмет есть, а 0-что этого предмета нет.
теперь самое интересно, нам надо узнать, а есть ли в этом числе часы, то есть 3-ий разряд в этом числе 0 или 1 ? в калькуляторе просто берем и переводи наше число в двоичный вид(101100100) и смотрим 3-ий разряд числа. там 1 - то есть часы есть. Все.
а если нужны функции то вот они:
unsigned char getBit(unsigned char c, int n){ return (c >> n) & 1;
unsigned char clearBit(unsigned char c, int n){ return c & ~(1 << n); }
unsigned char setBit(unsigned char c, int n){ return c | (1 << n); }
|
|
| |
|