Показано с 1 по 3 из 3

Тема: Работаем с битами

  1. #1
    Проверенный Аватар для georJik
    Регистрация
    07.07.2013
    Сообщений
    1,370
    Репутация: 427

    Звание: - очень-очень хороший человек

    Работаем с битами

    Йо. Этот тутор предназначен для более-менее соображающих в программировании. В нашем случае мы будем учиться работать с битами. На первый взгляд это выглядит страшно и непонятно, но если вникнуть - это значительно облегчит вам работу..
    И так, для начала ознакомьтесь с побитовыми операторами ( http://pawno.su/showthread.php?t=304...F2%EE%E2%FB%E5 ) - что нашел.

    А теперь попробуем начать использовать их, на примере давайте заменим банальные лицензии. Например у нас их три - на лодку воздух и авто.

    Создаем нашу переменную в которой записаны биты.
    PHP код:
    new lics 0b000
    Как мы знаем 0 - false, то есть ложь; 1 - true, то есть истина. В нашем случае будет также - 0 есть лицензия, 1 - нету.

    Внимание! Биты как и массив начинаются с нулевого!

    Давайте попробуем присвоить значение лицензии на авто - 1
    Как мы это сделаем:
    PHP код:
    lics ^= (1<<0); 
    Поясню, как вы помните из предыдущего тутора, ^ - это оператор "Исключающее или", почему мы используем именно его? Потому-что если вы захотите инвертировать сразу несколько битов - он нам в этом поможет.
    И так, мы инвертируем первый бит справа налево, т.е

    Как было:
    PHP код:
    0b000 
    Как стало:
    PHP код:
    0b001 
    Окей, с этим разобрались.

    А если нам нужно присвоить сразу несколько значений, как быть?
    Решение:
    PHP код:
    lics ^= ((1<<0)|(1<<1)|(1<<2)); 
    (1<<0) мы присваиваем нулевому биту слева значение 1, инверсия.
    (1<<1) если вы ещё не поняли почему первая цифра 1 - мы сдвигаемся на один бит влево; 1 - инвертируем первый бит читая справа налево.
    (1<<2) тоже самое что и все выражения выше, только уже операция производится со вторым битом.

    Тем самым мы произвели инверсию битов. Т.е если у нас было 000, мы вывели 111. ( также и наоборот )

    Дальше идет проверка на лицензии.

    Например, узнаем есть ли у нас лицензия на автомобиль
    PHP код:
    if((lics & (1<<0)) == 0) return SendClientMessage(playerid,0xFF0000FF,"У вас нет лицензии на автомобиль"); 
    Поясняю, мы проверяем почти также, как и устанавливаем. Т.е на сдвигаем на один бит влево ( в проверке ) и проверяем нулевой бит справа налево. Если он не равен нулю, значит лицензия есть. == 1 ставить не рекомендую.

    PHP код:
    if((lics & (1<<1)) == 0) return SendClientMessage(playerid,0xFF0000FF,"У вас нет лицензии на воздушный транспорт"); 
    То же что и выше, только проверяем уже второй бит

    Как примерно это будет выглядеть в моде?:

    PHP код:
    new lics[MAX_PLAYERS];

    callback PlayerReg(playerid) {
        
    lics[playerid] = 0b000;
    }

    CMD:givelicense(playerid,params[]) {
        if(
    sscanf(params,"u",params[0])) return SendClientMessage(playerid,-1,"/givelicense [id]");
        
    lics[params[0]] ^= (1<<0);
        
    SendClientMessage(playerid,-1, ((lics[params[0]] & (1<<0)) != 0) ? ("Лицензия на авто получена!") : ("Лицензия на авто изъята!"));
        return 
    true;

    p.s: Если хотите, можете юзать >> слева направо








    Автор: georJik


    Тема будет дополняться...

  2. 3 пользователей сказали cпасибо georJik за это полезное сообщение:

    Folleah (21.07.2014), Sanders (23.07.2014), Меша (08.05.2016)

  3. #2
    Проверенный Аватар для georJik
    Регистрация
    07.07.2013
    Сообщений
    1,370
    Репутация: 427

    Звание: - очень-очень хороший человек

    Re: Работаем с битами

    Делаем сохранение \ загрузку ( MySQL ):
    Для этого уже мы будем присваивать не 0b000, а 0 ( тоже самое что и 000 )
    Мы будем загружать целое число также как и сохранять, а менять уже в нем биты.

    Я предлагаю вам создать в вашем массиве игроков переменную Licenses, дабы было удобнее.

    Загружаем:

    PHP код:
    Player[playerid][Licenses] = cache_get_field_content_int(0"licenses"connectionHandle); 
    Player - ваш массив игрока
    Licenses - наши лицензии
    "licenses" - поле в БД где хранится наша переменная
    connectionHandle - переменная вашего соединения

    Сохраняем:
    PHP код:
    new query[81+1]; // 81 на запрос; Одну ячейку отдаем машине
    mysql_format(connectionHandle,query,80,"UPDATE `accounts` SET `licenses` = '%i' WHERE `Name` = '%s'",Player[playerid][Licenses],name);
    mysql_tquery(connectionHandle,query,"",""); 
    accounts - ваша таблица с аккаунтами
    licenses - ваше поле в бд для сохранении нашей переменной
    name - переменная определяющая имя игрока. Я предлагаю использовать удобный вариант - в массив игрока добавляем массив Name, который будет равен макс.значению имени игрока (24), далее в OnPlayerConnect присваиваем переменной значение нашего имени, думаю вы поняли как это сделать. Ну и использовать можно как Player[playerid][Name], либо создать макрос #define Name(%0) Player[%0][Name]. Это удобно и к тому же не нужно лишний раз создавать эти ненужные переменные. И так, тут думаю все ясно, посылаем запрос в таблицу accounts с нашими параметрами.

    Такие пироги, легко и просто, не правда ли?

  4. 1 пользователь сказал cпасибо georJik за это полезное сообщение:

    Меша (08.05.2016)

  5. #3
    Пользователь Аватар для Dominik_48
    Регистрация
    17.11.2014
    Сообщений
    40
    Репутация: 2

    Звание: пока не определено

    Re: Работаем с битами

    Во я теперь разобрался как работать с битами. :ay:

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •