| Поразрядность! |
|
Renault
| Дата: Четверг, 15.10.2009, 22:19 | Сообщение # 1 |
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
|
Вообщем, собсна что это? Что-то меня всё больше начинает интересовать эта поразрядность... мозолит глаза, и не могу найти ответ!
|
| |
| | |
|
WertyXBOCT
| Дата: Четверг, 15.10.2009, 22:26 | Сообщение # 2 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
скажи где встречал. Скорее всего речь идет о цихврах.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Ninja
| Дата: Четверг, 15.10.2009, 22:26 | Сообщение # 3 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
|
Oh, my God! You kill Kenny! You bastard!
|
| |
| | |
|
Renault
| Дата: Четверг, 15.10.2009, 22:41 | Сообщение # 4 |
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
|
Да неее... ф хелпе не могу понять с чем жувать вот это: | & ^: поразрядные операторы (| = поразрядный или, & = поразрядный and, ^ = поразрядный xor) << >>: поразрядные операторы (<< = shift left, > > = shift right)
|
| |
| | |
|
Ninja
| Дата: Четверг, 15.10.2009, 22:43 | Сообщение # 5 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
|
по той ссылке как раз это поясняется
Oh, my God! You kill Kenny! You bastard!
|
| |
| | |
|
WertyXBOCT
| Дата: Четверг, 15.10.2009, 23:05 | Сообщение # 6 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
Любые числа, это 1 и 0. Их запись в числе, это разряд. | & ^: поразрядные операторы - выполняются для каждого разряда, а не для числа в целом << >>: поразрядные операторы свдинуть разряд влево, и сдвинуть разряд вправо соответсвенно. A = 11010110(2) = 214(10) B = 10011011(2) = 155(10) A|B = 1 A&B = 1 A^B = хз))) верней не помню, вроде xor это сложение по модулю 2., тогда здесь будет 0. A>> //01101011 A|B = 1 [ 1+0 ] A&B = 0 [ 0 * 0 ] A^B = 1 [ 1 (+) 0 ] если исходить из предположения что xor это сложение по модулю 2(1+1=0, 0+1=1+0=1, 0+0=0) когда как простой ор (1+1=1+0=0+1=1,0+0=0)
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Ninja
| Дата: Четверг, 15.10.2009, 23:12 | Сообщение # 7 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
|
WertyXBOCT, что-то не очень понятно, что ты написал для твоих чисел A = ... 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 B = ... 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 A & B = 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 A | B = 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 A ^ B = 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1
Oh, my God! You kill Kenny! You bastard!
|
| |
| | |
|
WertyXBOCT
| Дата: Четверг, 15.10.2009, 23:16 | Сообщение # 8 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
значит я сам нифига не понял. Надо на практике проверять.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Renault
| Дата: Четверг, 15.10.2009, 23:42 | Сообщение # 9 |
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
|
Лана паняна... вообщем это тёмный лес... я луче обойду его стороной... как делал это и раньше!
|
| |
| | |
|
NewStrannik
| Дата: Пятница, 16.10.2009, 11:29 | Сообщение # 10 |
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
|
|
| |
| | |
|
Renault
| Дата: Пятница, 16.10.2009, 15:01 | Сообщение # 11 |
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
|
NewStrannik, Спасибо! Буду иметь ввиду!
|
| |
| | |
|
Ang3L
| Дата: Пятница, 16.10.2009, 17:14 | Сообщение # 12 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Вы меня заставили посмеяться!  Такой у вас диалог получился... Примерно: -А что такое abs()? -Это когда убирается минус и числа. abs(-1) = 1; -Тогда чё то не сходится. abs(-2) = 2; -Да, я и сам не понял. Надо на практике проверять... Ход мыслей верен, вывод верен, а не поняли. Это логические операций. && - И. || - или. ^^ - исключающее или. Если яблоко красное И сладкое, то оно спелое, в остальных случаях не спелое. т.е. если и то, и то 1, то 1, в остальных случаях 0. Не придираемся к ботанике... Code if(apple.color == red && apple.taste == sweet) apple.isready = true; else apple.isready = false; Если у меня будет кашель ИЛИ сопли, то я болею. т.е. если будет что-то из этого или всё вместе, то я болею, иначе здоров. Code if(Ihave.cough == true || Ihave.suplimental == true) Iam.sick = true; else Iam.sick = false; Мне нужен мощный, либо защищённый корабль. Code if(space_ship.shield > 30 ^^ space_ship.attack > 30) show_message('This space ship is perfect.'); else show_message('This space ship is slow or weak.'); Это логические проверки, а с поразрядными функциями работают так. << - умножение на систему счисления, на наших компьютерах на 2. >> - деление на 2. Делают битовую карту (т.е. строка состоящая из нулей или единиц). ... Продолжение следует. Ща не успеваю.
Blogpost
|
| |
| | |
|
DreamRunner
| Дата: Пятница, 16.10.2009, 21:41 | Сообщение # 13 |
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
|
Да, хотелось бы примеров с битовыми операциями более жЫзненные, применимые в играх.  Я признаться тоже в них плаваю и ниразу не находил применения.
|
| |
| | |
|
Ninja
| Дата: Пятница, 16.10.2009, 22:39 | Сообщение # 14 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
|
DreamRunner, ну например сдвигами можно очень быстро умножать и делить на степени двойки, хотя в гм из-за интерпретации большого прироста не будет наверное. можно использовать в сетевых играх, где нужно передавать как можно меньше данных. например если какие-то 2 значения находится в пределах 4-х битов, т.е. от 0 до 31 15, можно их собрать в один байт и передавать как один байт, т.е. получается экономия одного байта. если гг может находиться в нескольких состояниях, к примеру идет, бежит, стреляет, стоит, прыгает и т.д., то одной переменной для состояния обойтись не удастся, т.к. в таком случае не получится обработать ситуацию "стреляет на бегу" например. можно завести переменную, в которой нулевой бит равен 1, если гг идет, иначе 0, первый бит будет показывать выполняется ли состояние "бежит", 3-ий - стреляет и т.д. теперь для того, чтобы проверить стреляет ли гг, достаточно узнать значение 3-го бита. если нужно задать лабиринт, где в каждой ячейке может находиться либо стена либо ничего, т.е. только 2 состояния, можно конечно сделать массив размером n*m, где n, m - размеры лабиринта, но это очень неэкономно по памяти, намного лучше завести массив байт размером n*[m/8], где каждое число будет хранить состояние 8-ми клеток, т.о. мы используем в 8 раз меньше памяти
Oh, my God! You kill Kenny! You bastard!
Сообщение отредактировал Ninja - Суббота, 17.10.2009, 10:42 |
| |
| | |
|
WertyXBOCT
| Дата: Пятница, 16.10.2009, 23:15 | Сообщение # 15 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
Ang3L, Тут ты не прав. Я думал, что операции происходят только ДЛЯ ПЕРВОГО БИТА, а Ninja говорит что ДЛЯ ВСЕГО ЧИСЛА, вот и все разница,это нужно проверять на практике.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
NewStrannik
| Дата: Суббота, 17.10.2009, 04:57 | Сообщение # 16 |
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
|
Название говорит само за себя: поразрядные/побитовые, т.е. каждый разряд/бит числа изменяется по каким-то правилам. Ninja, разве всего 32 бита? Тьфу, поторопился. :D Ну ничего, пусть знают, что в GM 64 битные переменные..
Сообщение отредактировал NewStrannik - Суббота, 17.10.2009, 13:16 |
| |
| | |
|
Ninja
| Дата: Суббота, 17.10.2009, 10:39 | Сообщение # 17 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
|
Quote (NewStrannik) Ninja, разве всего 32 бита? если ты про это Quote (Ninja) значения находится в пределах 4-х битов, т.е. от 0 до 31 я здесь не про количество битов говорю, а про то, что в 4 бита можно записать 32 разных значения, например от 0 до 31 если без знака и от -16 до 15 со знаком упс, перепутал, можно записать значения от 0 до 15 или от -8 до 7
Oh, my God! You kill Kenny! You bastard!
Сообщение отредактировал Ninja - Суббота, 17.10.2009, 10:41 |
| |
| | |
|
Ang3L
| Дата: Суббота, 17.10.2009, 14:07 | Сообщение # 18 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
NewStrannik, у тебя отсчёт на 1 сбился. 1) 2, а вот 0) 1. Тогда 24) 16777216 и 32) 4 млрд. не помню точно, считать лень. И получается что ГМ высчитывает битовые операций вплоть до 62 бит, почти 64. 63 бит высчитался, но он получился с минусом, поэтому, в целях безопасности, за 62 бита лучше не вылезать. Quote (WertyXBOCT) Я думал, что операции происходят только ДЛЯ ПЕРВОГО БИТА, а Ninja говорит что ДЛЯ ВСЕГО ЧИСЛА, вот и все разница,это нужно проверять на практике. А зачем это проверять?  Число переводится в двоичную систему. 255 = 1111 1111, например. И по разрядно проделываем операцию, а затем переводим обратно в десятичную. Если хотите реальный пример, то пожалуйста (к сожалению не относится к играм): маска подсети. Наверняка видели такого зверя. Как определяется подсеть пользователя? Используется оператор конъюнкций(логическое умножение, пересечение или просто "И", &): IP-адрес:......... 11000000 10101000 00000001 00000010 (192.168.1.2) Маска подсети:. 11111111 11111111 11111111 00000000 (255.255.255.0) Адрес сети:..... 11000000 10101000 00000001 00000000 (192.168.1.0) Первые 3 октета (192, 168, 1) остаются неизменными, а последний, четвёртый (2), сбрасывается на ноль. Смотрим почему оператор "И" называется пересечением: Каждый круг это какой-то оператор, выраженное своим узором. Там где они "пересекаются", там и действует оператор &. А вот игровой пример пересечения (нижний на картинке): Code if(monster.x > 0 && monster.x < view_xview[0] && monster.y > 0 && monster.y < view_yview[0]) draw_sprite(sMonster, -1, x, y); т.е. если монстр в пределах экрана, то рисуем его. "В пределах экрана" это когда его координаты входят в заданный прямоугольник, а как задать такой прямоугольник? Пересечением. Вот на картинке узоры ограничены, но на самом деле они бесконечны. Что такое monster.x > 0? Это множество значение x от 0 до бесконечности (до такого числа которое позволяет нам компьютер). А monster.x < view_xview[0]? Это значения от -бесконечности до view_xview[0]. Но пересекая их мы получаем значения от 0 до view_xview[0]. Также мы ограничиваем по y, и получаем квадрат - "в пределах экрана". || - оператор дизъюнкций, логического сложения или просто "ИЛИ". Он "зоны" объединяет. Вот видите два кружка сверху, вот он их объединит в одну. К сожалению, не могу перерисовать, я уже задолбался на этом нэтбуке работать. Это надо себе представить графически, тогда сразу поймёте. Логические операторы, это мощный инструмент по выбору значений. //выбираем оппонентов для атаки, спящих и слабых. Складываем. Выбираем и тех, и тех. if(enemy.weak || enemy.sleep) //выбираем магический, мифрильный меч. Пересекаем. Т.е. откидываем не мифрильные мечи и не магические. if(sword.magic && sword.mifril) Возвращаемся к побитовым операциям: Делаем битовую карту (т.е. строка состоящая из нулей или единиц). Помните КА к ИИ? Ща мы его немного переделаем из строк в битовые операций. Извиняюсь за точки, но надо было отформатировать текст. //маска, делаем удобный для нас вид walk = ..0; //0000 run = ...1; //0001 attack = 2; //0010 hunt = ..4; //0100 fear = ..8; //1000 status = walk | attack | fear; /*видите? Статус усложнился, теперь мы держим несколько статусов в одной переменной. Получится битовая карта: 1010 (или число 10). Характер бота можно сделать сколь угодно сложным (в пределах 62 бит, как мы выяснили). А главное, теперь мы этот статус можем легко передать другому боту.*/ Те кто программировал под Windows, не будут удивлены такой фишкой. Там это используется для определения свойств окна, например, или свойств отображения в DirectX. Как выбрать бота который боится? Смотрим: Quote if(bot.status & fear) {/*этот бот боится; как закончит, так переключаем в норм:*/ if(bot.fear_time == 0) bot.status ^= fear;//исключающее или играет роль переключателя, в чём вы можете убедится. } Или играет роль только включателя, а И выключателя, фильтра. Короче, разберётесь. Если будут вопросы, как всегда, задавайте.
Blogpost
|
| |
| | |
|
Ninja
| Дата: Суббота, 17.10.2009, 14:33 | Сообщение # 19 |
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
|
Quote (Ang3L) if((bot.status && fear) == fear) тут & надо, и == fear в гм писать необязательно, т.е. можно так: if(bot.status & fear) Добавлено (17.10.2009, 14:33) ---------------------------------------------
Quote (Ang3L) 63 бит высчитался, но он получился с минусом, поэтому, в целях безопасности, за 62 бита лучше не вылезать. это из-за способа представления чисел, 63 бит(в 8байтовых числах со знакам) используется для знака числа 0 - положительное, 1 - отрицательное, поэтому при сдвиге 1 на 63 разряда влево знаковый бит стал равен 1 и число стало отрицательным
Oh, my God! You kill Kenny! You bastard!
|
| |
| | |
|
Ang3L
| Дата: Вторник, 26.04.2011, 20:22 | Сообщение # 20 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote (Ninja) тут & надо, и == fear в гм писать необязательно Ну да. Это я попутал. Добавлено (26.04.2011, 20:22) --------------------------------------------- Тут вдруг понадобились битовые операций, ещё раз: Состояния должны быть единицами в двоичном исчислении на любом месте, т.е.: run = ...1; //0001 attack = 2; //0010 hunt = ..4; //0100 fear = ..8; //1000 Как вариант: run = ............1; //0000 0001 attack = ....1 << 1; //0000 0010 hunt = ......1 << 2; //0000 0100 strong = ....1 << 3; //0000 1000 fear = ......1 << 4; //0001 0000 flee = ......1 << 5; //0010 0000 aggressive = 1 << 6; //0100 0000 smart = .....1 << 7; //1000 0000 Если хотите включить: status |= любое из состояний или их сумма; Quote status |= aggressive | fearless | smart; //включит агрессию, бесстрашие и ум Если переключить: status ^= любое из состояний или их сумма; Quote status ^=hunt | smart; //переключит охоту и ум Если выключить: status &= ~(любое из состояний или их сумма); Quote status &= ~(aggressive | flee | smart); //выключит агрессию, страх и ум Пройтись по всем (не проверял, но должно работать): Code var state; for(state = 1; state < 1<< всего_состояний; state << 1) if(status & state) show_message('Есть такое состояние.');
Blogpost
|
| |
| |
|
|