Бит, байт, слово, двойное слово - Игростроение и развлечение

Форма входа

Приветствую Вас Гость!

Логин:
Пароль:

Наш опрос

Почему вы занимаетесь сексом?
Всего ответов: 64


    Случайное фото

    Статистика


Поддержите наш проект

WebMoney:
R309699065243
U292079291240
Z373355457648

Счётчики


Rambler's Top100
Рейтинг@Mail.ru

Бит, байт, слово, двойное слово - Игростроение и развлечение

[ Новые сообщения · Участники · Правила форума · RSS ]

WWW Site Forum
Страница 1 из 11
Игростроение и развлечение » Программинг » Языки программирования и конструкторы » Бит, байт, слово, двойное слово (Работа с логическими операциями.)
Бит, байт, слово, двойное слово
KostiaДата: Четверг, 22.01.2009, 13:57 | Сообщение # 1
Программист
Группа: Проверенные
Сообщений: 80
Репутация: 2
Статус: Offline
После прочтения статьи вы будете знакомы с логическими операциями и сможете умело ими оперировать.
Начнем с or - или. В школьной программе по информатике вы должны были чертить таблицы истинности в тетраде и Excel. Но на всякий случай
1 or 1 = 1
0 or 1 = 1
1 or 0 = 1
0 or 0 = 0
1 - истина 0 - ложь

Где это можно применить, например в условии цикла или в ветвлении.
if (мне > 5 лет)or(я выше 130 см) then могу прокатиться на этом аттракционе

Но or = +. Т.е. мы можем объединить несколько логических значений в одной переменной. Для чего спросите вы, а я отвечу, дайте волю своей фантазии.
У нас есть байт a
00000000
Мы знаем что первый бит отвечает за ,например, движение игрока вверх, второй вниз, третий влево, четвертый вправо.

Code
var
     a: byte;
begin
     if up then a:=a or 1; //00000001
     if down then a:=a or 2; //00000010
     if left then a:=a or 4; //00000100
     if right then a:=a or 8; //00001000
end;

Переменная a служит нам контейнером логических переменных. Теперь можно определить движение используя простой оператор case.

Code
case a of
     1:Up;
     2:down;
     4:left;
     8:right;
     3:updown; //1+2=3, чего просто быть не может, но все же напишу(в смысле вверх и вниз одновременно)
     5:upleft; // 1+4=5 вверх и влево
     9:upright; //1+8=9 вверх и вправо
     ...
end;

Думаю теперь понятно как работает логическая операция OR и куда ее можно пристроить.

xor - логическое вычитание.
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0

01101011
xor
00101101
________
01000110

100 xor 11 = 111 = 7. 4-3=7 :-)
110 xor 10 = 100 = 4. 6-2=4

С xor думаю понятно.

and - и. Логическое умножение.
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0

И действительно 1*1=1; 1*0=0; 0*1=0; 0*0=0;
AND нужно применять когда мы хотим чтобы одновременно выполнялось 2 и более условия.
if(у меня 5 рублей)and(50 копеек) then я могу купить мороженое.

Но для AND можно найти более продвинутое применение, например для определения истинности определенного бита в числе. Вернемся в прошлый пример, где при помощи case проверяли ориентацию движения персонажа, все это можно реализовать более удобным и простым способом.

Code
if a and 1=1 then up //00000001 and 00000001 = 00000001 = 1 идем вверх
else //если не вверх, то возможно вниз
if a and 2=2 then down; //00000010 and 00000010 = 00000010 = 2 идем вниз
if a and 4=4 then left //00001111 and 00000100 = 00000100 = 4 идем влево
else //если не влево, то возможно вправо
if a and 8=8 then right; //00000111 and 00001000 = 00000000 = 0 - значит направо идти не надо

В общем должно быть понятно, но на всякий случай еще пример на пальцах:
00001010
and
00001000
________
00001000

not - не. Инверсия. было 1010 стало 0101.
not 1 = 0
not 0 = 1

Думаю хватит.

И теперь сдвиги. shl и shr. Сдвиг влево и сдвиг вправо соответственно.
0001 shl 1 = 0010 = 2
0010 shl 1 = 0100 = 4

Таким образом можно возвести 2 в n степень. Например 2^10=1024, 1 shl 10 = 1024, 1 shl n = 2^n

0100 shr 1 = 0010 = 2
0010 shr 1 = 0001 = 1

1024 shr 1 = 512
32 shr 5 = 1;

Теперь можно опять вернуться к предыдущему примеру и проверить ориентацию персонажа используя сдвиг и and.

Code
if a and 1=1 then up
else
if a shr 1 and 1=1 then down;
if a shr 2 and 1=1 then left
else
if a shr 3 and 1=1 then right;

Т.е. мы реально узнаем значение n-го бита в числе. Допустим имеется число 10111101 и нам нужно вытащить 5-й бит.
10111101 shr 4 = 1011
1011 and 0001 = 1

или 7-й бит

10111101 shr 6 = 10
10 and 01 = 0

Хочу заметить, что все эти логические операции выполняются процессором очень быстро и умение ими оперировать вам очень поможет в будущем.
Спасибо за внимание, всегда ваш Семенов Константин.

Добавлено (22.01.2009, 13:57)
---------------------------------------------
Немного по сабжу, а то столько написал и все не по теме:)

Байт - 8 бит - одна буква - byte
Слово - 16 бит - 2 буквы - Word
Двойное слово - 32 бита - 4 буквы - DWORD

Сообщение отредактировал Kostia - Четверг, 22.01.2009, 16:20
 
KostiaДата: Вторник, 03.09.2013, 23:12 | Сообщение # 2
Программист
Группа: Проверенные
Сообщений: 80
Репутация: 2
Статус: Offline
Для того чтобы узнать четное число или нет не нужно искать остаток от деления. Суть в том что в двоичном представлении числа, четные числа заканчиваются на 0, а нечетные на 1. Отсюда:
Код
c++:
if(i & 1) //нечетное
if(!(i & 1)) //четное

pascel:
if i and 1 = 1 then //нечетное
if i and 1 = 0 then //четное
 
quadrathellДата: Среда, 04.09.2013, 11:24 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1018
Репутация: 23
Статус: Offline
Такую тактику я применял в игре "Магический квадрат" квадратик с проходами имел 4 бита по всем 4 направлениям.
Включенный (1) или отключенный (0) бит, отвечал за наличие прохода.
Код картинки квадратика на котором находился персонаж, был числом переведённым тех же 4 бит в десятичное число.
Путём and, or, xor и т.д. можно было варьировать с битами по задумке и мгновенно, не изобретая велосипед )


 
Игростроение и развлечение » Программинг » Языки программирования и конструкторы » Бит, байт, слово, двойное слово (Работа с логическими операциями.)
Страница 1 из 11
Поиск: