Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
1

Математические операции or и and

13.03.2016, 20:41. Просмотров 946. Ответов 14
Метки нет (Все метки)

Я правильно понимаю, что можно сделать так:
i:=0;
i:=i or 5;
И так можно сделать раз 30, добавляя любые числа.
И потом можно узнать (5 and i) добавлялось ли это число ранее или как это работает и зачем нужно?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2016, 20:41
Ответы с готовыми решениями:

Математические операции с элементами ComboBox
У меня есть форма, в которой находятся 2 ComboBox, в каждом записаны элементы массива , всего...

Математические операции с ячейками StringGrid
на форме 11 strinngrid. ( надеюсь праграмма выдержит ). если кто спросит зачем столько strinngrid...

Математические операции с шестнадцатиричными числами. Как?
Задача примитивная, но без перевода в десятичную cистему сделать не могу. Может подскажите? В...

Математические операции
Число 27С2 записать в регистр ВХ. Число 3D5А записать в регистр СХ. Сложить эти числа. К полученной...

Математические операции
$sql = @mysql_query("SELECT SUM(yo) FROM `1` WHERE `nick` = '".$_COOKIE."'"); $row =...

14
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
13.03.2016, 20:50 2
Лучший ответ Сообщение было отмечено artyoms как решение

Решение

Цитата Сообщение от artyoms Посмотреть сообщение
добавляя любые числа.
И потом можно узнать (5 and i) добавлялось ли это число ранее или как это работает и зачем нужно?
работает так Битовые операции

не совсем любые, как правило используют значения степени двойки, т.к. при сложении именно любых значений может произойти накладка при проверке (прибавили значение 5, а при проверке на наличие значения 1 даст положительный результат, хоть единица тут не участвовала)
используется для указания набора некоторых значений из списка

виртуальный пример:
признак 1 = 1
признак 2 = 2
признак 3 = 4

общий признак = признак 1 or признак 3
если общий признак and признак 2 = признак 2 то общий признак содержит значение признак 2
иначе не содержит
0
mss
2640 / 2264 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
13.03.2016, 20:50 3
or и and - логические операторы, а не математические
0
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
13.03.2016, 21:06  [ТС] 4
cotseec, спасибо большое, так и произошло как ты написал.

Добавлено через 7 минут
Допустим мне нужно подобное сделать с картами, 13 карт - 4 масти.
Первые 13 карт масти будут как я понял
1,
2,
4,
8,
...4096
А второй набор с какого числа начинать?
0
13.03.2016, 21:06
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
13.03.2016, 21:19 5
Цитата Сообщение от artyoms Посмотреть сообщение
13 карт - 4 масти
имхо, лучше так:
масть 1 = 0
масть 2 = 1
масть 3 = 2
масть 4 = 4
карта 1 = 8
карта 2 = 16
....
карта 13 = 2^(4 + 13)
итого 17 бит (DWORD'a хватит)

итого
карта 1 масти 1 = 8 or 0 (8)
карта 1 масти 4 = 8 or 4 (12)
1
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
13.03.2016, 21:28  [ТС] 6
Я всё правильно понял?
первая масть от 4 до 16384
четвёртая от 32 до 131072
0
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
13.03.2016, 21:46 7
Цитата Сообщение от artyoms Посмотреть сообщение
первая масть от 4 до 16384
четвёртая от 32 до 131072
все карты первой масти: 8, 16, 32, 64, 128, 256, 512 и т.д. до 2^(13+4) (131072)
все карты второй масти: 8+1, 16+1, 64+1, 128+1 .... 2^(13+4)+1
все карты третьей масти: 8+2, 16+2 ... 2^(13+4)+2
все карты четвертой масти 8+4, 16+4 .... 2^(13+4)+4
0
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
13.03.2016, 21:50  [ТС] 8
сори, сильно извиняюсь (за невнимательность), я практически сразу понял как надо сделать после того как написал, но в экселе долго искал как сделать операции or и не успел исправить
0
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
13.03.2016, 22:02 9
upd: все влезет в 16 бит (WORD)
0
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
14.03.2016, 10:57  [ТС] 10
cotseec, не получилось, в результатах выдаёт совпадение
Delphi
1
2
3
4
5
      M_Cards: array [1..52] of Word =
      (8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,
       9,17,33,65,129,257,513,1025,2049,4097,8193,16385,32769,
       10,18,34,66,130,258,514,1026,2050,4098,8194,16386,32770,
       12,20,36,68,132,260,516,1028,2052,4100,8196,16388,32772);
0
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
14.03.2016, 23:50 11
Цитата Сообщение от artyoms Посмотреть сообщение
в результатах выдаёт совпадение
в приведенном массиве совпадений не вижу (все значения разные)

пофантазирую, исходя из того, что неизвестна конечная цель обсуждаемой затеи:
требуется каким-то образом узнавать какие карты (масть и достоинство) у игрока, то, что обсуждалось выше определяет только одну карту, соответственно набор карт - это массив данных, т.е.
карта 1: $08 or $00
карта 2: $0F or $01
карта 3: $200 or $02
карта 4: $100 or $01
карта 5: $400 or $04

еще вариант:
каждая карта обозначается числом (от 1 до 52): 1-13 одна масть, 14-26 вторая масть, 27-39 третья масть и 40-52 четвертая масть, масть получается делением нацело значения (Card div 13), достоинство карты - остатком от деления (Card mod 13), опять же массив карт хранит некоторый набор

еще вариант:
использование множеств - всего 17 значений (4 масти + 13 достоинств) - смысл тот же, что и с побитовым сложением, каждая карта будет обозначаться некоторым множеством ([{масть}, {достоинство карты}]), в итоге несколько карт - массив множеств

еще вариант:
использовать записи из двух полей: масть и достоинство (типы этих полей - какие удобнее), несколько карт массив записей

еще вариант:
перейти к ООП и описать класс карты, который будет хранить масть и достоинство и некоторые плюшки, присущие карте (вес в игре, картинку и т.п.), несколько карт - список объектов
0
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
15.03.2016, 11:00  [ТС] 12
cotseec,
Цель очень простая:
Мы выбираем случайную карту из 52, проверяем есть ли эта карта в массиве(списке) мёртвых(уже выбранных) карт, если нету то проводим с ней какие то действия и добавляем в массив(список) мёртвых карт.
Раньше я делал через простой поиск по массиву(списку) мёртвых карт циклом for to do - если нашли совпадение значит заново определяем случайную карту - нет то добавляем в список. Но это очень медленный способ.
Недавно узнал об (and or) и понял что можно сделать намного быстрее.

"в приведенном массиве совпадений не вижу (все значения разные)" В массиве совпадений нет, есть тут:
DeadCrads: int64;
Далее добавляем какие то разные карты DeadCrads:=DeadCrads or MCards[];
Далее берём карту, которую уже ранее добавили, смотрим есть ли она в DeadCrads (DeadCrads and MCards[]) и иногда ответ выдаёт что нету, а на самом деле есть.
0
northener
пофигист широкого профиля
3521 / 2394 / 645
Регистрация: 15.07.2013
Сообщений: 14,302
15.03.2016, 11:13 13
52 карты проще поместить во множество. Тут уж точно неувязок с добавлением и проверкой не будетю
0
artyoms
1 / 1 / 0
Регистрация: 28.10.2012
Сообщений: 168
15.03.2016, 15:29  [ТС] 14
Сейчас потестил метод с (and or) и метод с помещением 52 карт в одно множество, на большое кол-во операций:
1 2,4 сек
2 3,6 сек

Добавлено через 42 минуты
cotseec, а можно поподробнее с твоим вариантом множеств?
0
cotseec
Пишу на Delphi...иногда
1413 / 1272 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
16.03.2016, 23:44 15
см. #13
Множества
некоторый пример:
Delphi
1
2
3
4
5
6
7
8
9
10
type
    TCards = set of byte;
...
var
   DeadCards: TCards;
   MCards: byte;
....
   DeadCards := DeadCards + [38];// добавляем какую-то карту во множество "мертвых"
   MCards := 38; // выпала какая-то карта
   if MCards in DeadCards then // карта "мертвая"
0
16.03.2016, 23:44
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2016, 23:44

Математические операции
Извините))Можно у вас спросить...а почему у меня не получается если я по-другому сделала???(2...

Математические операции
Доброго времени суток. Возникла проблема необходима написать доп приложение которое будет выполнять...

Математические операции
Язык С, необходимо сделать ассемблерную вставку со следующим уравнением: (a-b)*(c-d) = ac-bc-ad +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.