00085. Работа с битами переменных
Работа с битами переменных|Если вы изучали "Программирование" или "Основы цифровой техники", то эту тему вам без труда понять. Если же нет - будем сейчас изучать.|wmysterio|wmysterio||||Начнём с того, что каждая переменная состоит из битов. Бит - значение, которое может принимать значение 0 или 1. Их совокупность формирует какую-то информацию ( например: целое число ). Остановимся сы как раз на целых числах. Каждая переменная этого типа может иметь 32 бита. Пример: число 62 - это тоже самое, что и комбинация битов 111110, но это число не стоит воспринимать как десятичное. Здесь 111110 записано в двоичной системе числения, которые, как известно, состоит из ряда двух чисел - 0 или 1. В зависимости от порядка их размещения мы получаем разные результаты. Например: если мы поменяем последние цифры местами ( 111101 ) то результат будет - 61.
Как же собственно перевести число в двоичную систему числения? Хороший вопрос. Всё довольно просто. Нужно десятичное ( обычное для нас ) число постоянно делить на число 2 нацело. После чего в остатке в нас всегда будет число 0 или 1. Результат делим опять на 2 и так до тех пор, пока делить уже будет невозможно. В результате мы берём все остатки ( должен получится список чисел 0 и 1 ). После этого запишем это число в обратном направлении. Тоесть если мы получили комбинацию 011011, то результатом будет комбинация - 110110. Чтобы было понятнее, посмотрите картинку:
Как видите число 75 делили на 2. В нас вышло число 37, так как делить нужно на цело ( без дробной части ). 37*2 даёт 74. В результате вычитания мы получаем число комбинации - 1. Если вы тестируете и результат вышел более чем 1, то вы допустили ошибку. Затем результат ( 37 ) мы снова делим на 2 и результатам будет 18, а остаток 1. Мы получаем вторую цифру комбинации и в результате комбинация будет иметь вид - 11. Так по-аналогии вычисляем комбинации. Когда в результате деления будет число 1, то известно, что его поделить нацело на 2 нельзя, поэтому он перемещается автоматически в комбинацию битов. Собственно мы её получили - 1101001. Теперь нам осталось поменять местами эту комбинацию в обратную сторону ( смотрите вторую строку и по цвету увидите как нужно перемещать ). Мы получим комбинацию - 1001011. Это наше число 75 в двоичной системе числения. Не верите? Сделаем эксперимент!
Запустите калькулятор на вашем ПК. Выберите пункт "Вид->Программист".
Выберите "8 байт" на панели и установите чекбокс на "BIN". Теперь для ввода цифр в нас доступно только цифры 0 и 1:
Введите нашу битовою комбинацию:
Изменим чекбокс с "Bin" на "Dec" и что мы видим?
Всё верно! Комбинация битов в результате вычисления на калькуляторе совпало с нашим числом - 75!
Теперь расскажу о порядке битов. Комбинация 1001011 состоит из 7 битов ( так, как там 7 чисел ). Каждый их них имеет свой порядковый номер, который начинается с нуля ( нулевой бит ). Максимальный же - 31-й бит. Можно сформировать таблицу битов:
Номер бита
Числовое значение
0
1
1
1
2
0
3
1
4
0
5
0
6
1
К-во битов: 7
Комбинация: 1001011
Можно сделать вывод, что биты читаются справа налево. Естественно, для подобных случаев пользуйтесь калькулятором для переводов. Я здесь расписал для того, что бы вы поняли откуда всё берётся :)
Собственно, зачем всё это нужно? Очень даже нужно! Например: при редактировании игровой памяти, где во многих случаях нужно будет изменять значения, которые изменяются только по битам.
Рассмотрим опкоды:
1
08BA: set [email protected] bit 1
Copied!
Задать переменной бит в числовое значение 1.
Здесь: [email protected] - нужная переменная 1 - номер бита ( см. таблицу выше )
1
08C0: clear [email protected] bit 1
Copied!
Задать переменной бит в числовое значение 0 ( очищает бит от значения 1 ).
Здесь: [email protected] - нужная переменная 1 - номер бита ( см. таблицу выше )
Так же можно проверить "Бит переменной равен 1?":
1
08B4: test [email protected] bit 1
Copied!
Здесь: [email protected] - нужная переменная 1 - номер бита ( см. таблицу выше )
Обратите внимание, что проверять можно только на единицу. Для того, что бы проверить "Бит переменной равен 0?" нужно:
1
88B4: not test [email protected] bit 1
Copied!
Пример "Переодевания" я взял со справки, так как сейчас нет времени делать:
1
create_thread @TEST1
2
3
:TEST1
4
thread 'TEST1'
5
$391 = 0 // integer values
6
7
:TEST1_18
8
wait 0
9
if
10
00E1: key_pressed 0 8 //Group CTRL Forward
11
jf @TEST1_46
12
08BA: set $391 bit 0
13
jump @TEST1_102
14
15
:TEST1_46
16
wait 0
17
if
18
00E1: key_pressed 0 9 //Group CTRL back
19
jf @TEST1_74
20
08BA: set $391 bit 1
21
jump @TEST1_102
22
23
:TEST1_74
24
wait 0
25
if
26
00E1: key_pressed 0 10 //conversation - no
27
jf @TEST1_102
28
08BA: set $391 bit 2
29
30
:TEST1_102
31
wait 0
32
if
33
08B4: test $391 bit 0 // проверяем равен ли нулевой bit единице
34
jf @TEST1_235 //если нет то переходим на следующую метку
35
Player.SetClothes($PLAYER_CHAR, "PLAYER_TORSO", "TORSO", Torso)
36
Player.SetClothes($PLAYER_CHAR, "AFRO", "AFRO", Head)
37
Player.SetClothes($PLAYER_CHAR, "BBSHORTRED", "BOXINGSHORT", Legs)
38
Player.SetClothes($PLAYER_CHAR, "COWBOYBOOT2", "BIKER", Shoes)
39
Player.Build($PLAYER_CHAR)
40
0110: clear_player $PLAYER_CHAR wanted_level
41
//А это делаем, для того, чтобы копы игрока не доставали после переодевания
42
jump @TEST1_510
43
44
:TEST1_235
45
wait 0
46
if
47
08B4: test $391 bit 1
48
jf @TEST1_372
49
Player.SetClothes($PLAYER_CHAR, "BBJERSEY", "SLEEVT", Torso)
50
Player.SetClothes($PLAYER_CHAR, "GROOVECUT", "GROOVECUT", Head)
51
Player.SetClothes($PLAYER_CHAR, "SUIT1TRGANG", "SUIT1TR", Legs)
52
Player.SetClothes($PLAYER_CHAR, "SHOEDRESSBRN", "SHOE", Shoes)
53
Player.Build($PLAYER_CHAR)
54
0110: clear_player $PLAYER_CHAR wanted_level
55
jump @TEST1_510
56
57
:TEST1_372
58
wait 0
59
if
60
08B4: test $391 bit 2
61
jf @TEST1_510
62
Player.SetClothes($PLAYER_CHAR, "TSHIRTERISYELL", "TSHIRT", Torso)
63
Player.SetClothes($PLAYER_CHAR, "WEDGE", "WEDGE", Head)
64
Player.SetClothes($PLAYER_CHAR, "BBSHORTWHT", "BOXINGSHORT", Legs)
65
Player.SetClothes($PLAYER_CHAR, "FLIPFLOP", "FLIPFLOP", Shoes)
66
Player.Build($PLAYER_CHAR)
67
0110: clear_player $PLAYER_CHAR wanted_level
68
69
:TEST1_510
70
08C0: clear $391 bit 0
71
08C0: clear $391 bit 1
72
08C0: clear $391 bit 2
73
jump @TEST1_18
Copied!
Будет время, покажу вам как сделать вот такую вот ветку талантов, из моего скрипта Warlock:
|919|1|0|23691172`png`453`285`400`251``\|59363386`png`419`383`399`365``\|39305871`png`417`380`400`364``\|14749138`png`407`67`400`65``\|20373833`png`419`383`399`365``\|32440651`png`500`300`400`240``\||rabota_s_bitami_peremennykh|1499848405
Copy link
Edit on GitHub