Create site free
Поразрядность! - Решение серьезных вопросов - Разработка игр на Game Maker (Advanced Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Advanced Mode) » Решение серьезных вопросов » Поразрядность! (Что это?)
Поразрядность!
Renault Дата: Четверг, 15.10.2009, 22:19 | Сообщение # 1
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
Вообщем, собсна что это? Что-то меня всё больше начинает интересовать эта поразрядность... мозолит глаза, и не могу найти ответ! wink
 
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
если ты про побитовые операции, то тут например можно почитать http://www.vedikhin.ru/2006/07/bit-operations.html


Oh, my God! You kill Kenny! You bastard!
 
Renault Дата: Четверг, 15.10.2009, 22:41 | Сообщение # 4
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
Да неее... ф хелпе не могу понять с чем жувать вот это:

| & ^: поразрядные операторы (| = поразрядный или, & = поразрядный and, ^ = поразрядный xor)
<< >>: поразрядные операторы (<< = shift left, > > = shift right)
dry

 
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
Лана паняна... вообщем это тёмный лес... я луче обойду его стороной... как делал это и раньше! wink
 
NewStrannik Дата: Пятница, 16.10.2009, 11:29 | Сообщение # 10
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Renault, да это не так и тяжело, разве что не надо сразу бросаться в побитовую хрень, вначале почитай о системах исчисления и да прибудет с тобой свет!)
http://ru.wikipedia.org/wiki/Система_счисления
Хотя тебе нужно именно: http://ru.wikipedia.org/wiki/Позиционная_система_счисления
P.S.: Если ты хочешь программированием заняться, то надо хоть немного знать основы.
 
Renault Дата: Пятница, 16.10.2009, 15:01 | Сообщение # 11
Сказал что-то
Группа: Пользователь
Сообщений: 77
Статус: Offline
NewStrannik, Спасибо! Буду иметь ввиду! wink
 
Ang3L Дата: Пятница, 16.10.2009, 17:14 | Сообщение # 12
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Вы меня заставили посмеяться! happy Такой у вас диалог получился...

Примерно:
-А что такое abs()?
-Это когда убирается минус и числа. abs(-1) = 1;
-Тогда чё то не сходится. abs(-2) = 2;
-Да, я и сам не понял. Надо на практике проверять...

Ход мыслей верен, вывод верен, а не поняли. cool

Это логические операций. && - И. || - или. ^^ - исключающее или.

Если яблоко красное И сладкое, то оно спелое, в остальных случаях не спелое. т.е. если и то, и то 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.

Делают битовую карту (т.е. строка состоящая из нулей или единиц).

...

Продолжение следует. Ща не успеваю. happy



Blogpost
 
DreamRunner Дата: Пятница, 16.10.2009, 21:41 | Сообщение # 13
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
Да, хотелось бы примеров с битовыми операциями более жЫзненные, применимые в играх. smile Я признаться тоже в них плаваю и ниразу не находил применения.
 
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 говорит что ДЛЯ ВСЕГО ЧИСЛА, вот и все разница,это нужно проверять на практике.

А зачем это проверять? biggrin Число переводится в двоичную систему. 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;//исключающее или играет роль переключателя, в чём вы можете убедится.
}

Или играет роль только включателя, а И выключателя, фильтра. Короче, разберётесь.

Если будут вопросы, как всегда, задавайте.

Прикрепления: 2207528.png(23Kb)


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 в гм писать необязательно

Ну да. Это я попутал. cool

Добавлено (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
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Advanced Mode) » Решение серьезных вопросов » Поразрядность! (Что это?)
Страница 1 из 11
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход