Работа с битами переменной.
Работа с битами переменной.
Наверное многие задавались вопросом, что же это за такие мудреные команды?
08BA: set $391 bit 0
08C0: clear $391 bit 0
08B4: test $391 bit 0
Любому человеку, изучавшему основы программирования известно, что число в машинном коде представлено в виде нулей и единиц, то есть в двоичной системе счисления. Минимальной единицей информации в компьютере является бит. Бит может быть либо «выключен», при этом его значение равно нулю, либо «включен», тогда его значение равно единице.
Процессор в РС и по сей день используют 32-битную архитектуру (intel и AMD выпускают процессоры с 64-битной архитектурой, но на данный момент операционные системы толком ее не поддерживают). Биты пронумерованы от 0 до 31 справа на лево:
31 30 29 28 27 ………..5 4 3 2 1 0.
К примеру десятичное число 65 будет представлено так:
0000 0000 0000 0000 0000 0000 0100 0001.
Ну что ж вернемся к нашим опкодам.
0004: $391 = 0 // integer values
прировняв переменную $391 к нулю мы, тем самым, установили все 32 бита в ноль.
Следующим опкодом 08BA: set $391 bit 0 мы устанавливаем нулевой опкод равным единице, то есть 0000 0000…………..0000 0001.
Для примера напишем такой поток:
:TEST1
0004: $391 = 0 // integer values
:TEST1_1
08BA: set $391 bit 0
:TEST1_2
045A: text_draw_1number 20.0 430.0 ' NUMBER ' $391 // ~1~
wait 3000
end_thread
В результате в нижнем левом углу экрана появится цифра 1.
Для чего это нужно?
Предположим что переменная $391 у нас будет отвечать за одежду игрока. К примеру нулевой бит имеет отношение к головному убору или прическе, второй – рубашка, третий – штаны и так далее. Тогда
08BA: set $391 bit 0
08BA: set $391 bit 1
08BA: set $391 bit 2
будет означать что вся эта одежда будет применена к модели игрока.
Перед созданием игрока делаем проверку
00D6: if
08B4: test $391 bit 0
004D: jump_if_false @
тем самым мы проверяем равен ли нулевой бит единице.
Опкод 08C0: clear $391 bit 0 – очишаем нулевой бит переменной, то есть приравниваем его к нулю.
Для примера рассмотрим такой поток.
:TEST1
0004: $391 = 0 // integer values
:TEST1_1
08BA: set $391 bit 0
08BA: set $391 bit 1
08BA: set $391 bit 2
//1,2,3 биты равны 1
:TEST1_2
wait 0
00D6: if
08B4: test $391 bit 0 // проверяем равен ли единице нулевой бит
004D: jump_if_false @TEST1_3 //если нет
087B: set_player $PLAYER_CHAR clothes "PLAYER_FACE" "HEAD" body_part 1
070D: build_player $PLAYER_CHAR
:TEST1_3
wait 0
00D6: if
08B4: test $391 bit 1
004D: jump_if_false @TEST1_4
087B: set_player $PLAYER_CHAR clothes "PLAYER_TORSO" "TORSO" body_part 0
070D: build_player $PLAYER_CHAR
:TEST1_5
wait 3000 // задержка для того что бы успеть нажать кнопку
00D6: if
00E1: key_pressed 0 10 //нажата ли кнопка N
004D: jump_if_false @TEST1_7 // если нет, то идем на метку завершения потока
08C0: clear $391 bit 0
08C0: clear $391 bit 1
08C0: clear $391 bit 2
jump @TEST1_2