Помощник
|
Тильда |
Letmetouchyou
|
Сообщение
#1
|
||
|
|
||
|
|||
alexdrob |
24.5.2011, 23:25;
Ответить: alexdrob
Сообщение
#2
|
|
Какое ёё практическое применение? Без неё сложно будет обойтись при работе с битовыми масками, как сбросить бит? [PHP] public Boolean isFlag(int v){ return m_flags & v; } public void Add(int v){ m_flags |= v; } public void Remove(int v){ m_flags = m_flags &~ v; }[/PHP] |
|
|
pavelsc |
24.5.2011, 23:55;
Ответить: pavelsc
Сообщение
#3
|
|
Letmetouchyou, разъясняю все как есть - это битовые операции. Проводятся тока с типом интегер. При проведении операции "Тильда" (звучит как зачистка терроров :rolleyes:) проводится инверсия битов у двоичного представления числа. Например результат ~12 будет -13. Математически эту операцию можно представить как -(x+1). Разберем ваш пример:
!~(-1) = !(-(-1+1)) = !(-0) = !0 = 1 = true; В остальных случаях вы просто логическое не (!) применяли к значениям, равным true и выдавало false. В js все что не равно 0, null, "", false, undefined, NaN имеет значение true. |
|
|
Letmetouchyou
|
Сообщение
#4
|
|
pavelsc, ну ето я понимаю, вот только на практике как не пойму, где ето полезно(
|
|
|
Letmetouchyou
|
Сообщение
#5
|
|
alexdrob, не очень ясен пример(
m_flags |= v; что тут занчит " |= "? return m_flags & v; и тут " & "? p.s. какето беда случилась. первый раз встречаю такие консрукции. а все после прочтения этой статьи. |
|
|
Apay |
25.5.2011, 2:31;
Ответить: Apay
Сообщение
#6
|
|
| - побитовая or
& - побитовая and ~ - побитовая инверсия m_flags |= v; это m_flags = m_flags | v; например 10011101b & 11101111b = 10001101b или что то же 10011101b & ~00010000b = 10001101b это сбросить бит 10011101b | 00100000b = 10111101b это установить бит i=-~i - основанна на том что если i не определена то она "как-бы" ноль и отрицательные числа представляются в "дополнительном коде", то есть -1 = 11111111b -2 = 11111110b -3 = 11111101b ... |
|
|
alexdrob |
25.5.2011, 2:35;
Ответить: alexdrob
Сообщение
#7
|
|
Ну пример... (хотя в вэб программировании это почти не нужно)
Пишем сайт. У сайта есть несколько групп с разными правами. Но группы не расширят предыдущую а имею просто свой набор прав. Например Зарегистрированный ( может читать и писать ) Редактор ( Может редактировать посты ) Модератор (Может банить и удалять посты) делаем флаги [PHP] GROUP_REG = 1 << 0; // int 1 GROUP_REDACTOR = 1 << 1; // int 2 GROUP_MODERATOR = 1 << 2; // int 4 GROUP_ADMIN = 1 << 3; // int 8 [/PHP] то есть если по битам разложить в двоичную систему [PHP]GROUP_REG 00000001 GROUP_REDACTOR 00000010 GROUP_MODERATOR 00000100 GROUP_ADMIN 00001000[/PHP] Дальше юзеру задаём флаги. То есть устанавливаем биты. [PHP]user->flag |= GROUP_REG; user->flag |= GROUP_MODERATOR ;[/PHP] |= - это то же что и user->flag = user->flag | GROUP_REG; То есть как бы сложение. Мы к флагам добавляем новый флаг. А дальше провеям, например редактору нудно вывести кнопку редактирвоать. [PHP]if (user->flag & GROUP_REDACTOR) { echo "кнопка редактора"; }[/PHP] Так у нас в одной переменной хранится столько флагов сколько она бит. То есть переменная типа int может содержать 32 флага. А вот что бы удалить флаг, нам и нужна тильда. [PHP]user->flag = user->flag &~ GROUP_REDACTOR;[/PHP] Это сброс бита, больше он не редактор |
|
|
Letmetouchyou
|
Сообщение
#8
|
|
|
|
|
Letmetouchyou
|
Сообщение
#9
|
|
никогда в жизни не учил обычное програмирование. имею ввиду програмшина для пк и так далее. (с/с++ асемблер). И часто бывают не понятки с подобными вещами.
|
|
|
alexdrob |
25.5.2011, 3:58;
Ответить: alexdrob
Сообщение
#10
|
|
а вот математический смысл мне не ясен. есть биты [PHP]00001000 и 00100100[/PHP] | - означает или, то есть если или там или там установлен то в результате будет установлен (то есть как бы объединение) [PHP]00001000 | 00100100 = 00101100[/PHP] & - и, то есть и там и там если установлен то результат установлен 00101100 & 00100001 = 00100000 ~ - инверсия [PHP] ~ 00100001 = 11011110 [/PHP] теперь получаем &~ что и не в результате даст первое число со сброшенными битами второго числа. [PHP] 10010011 &~ 00010010 = 10010011 & 11101101 = 10000001 [/PHP] Я на сколько знаю в играх очень часто применяют, а в остальном не знаю. Ну по факту это то же самое что кучя полей типа Boolean Опишем движение танка, он едет, назад, и вправо. [PHP]move = true; forvard = false; left = false; right = true; backvard = true;[/PHP] то же самое только флагами. [PHP] //где то отдельно вынесены MOVE_MOVE = 0x01; // 00000001 или 1<<0 MOVE_FORV = 0x02; // 00000010 или 1<<1 MOVE_BACK = 0x04; // 00000100 или 1<<2 MOVE_LEFT = 0x08; // 00001000 или 1<<3 MOVE_RIGH = 0x10; // 00010000 или 1<<4 function addFlag(f){ this->flags |= f; } function isFlag(f){ return this->flags & f != 0; } ... // ну а используют например так flags->addFlag(MOVE_MOVE); flags->addFlag(MOVE_BACK); flags->addFlag(MOVE_RIGH ); //или так flags->addFlag(MOVE_MOVE | MOVE_BACK | MOVE_RIGH ); // а проверяют так if (flags->isFlag(MOVE_MOVE )){ echo 'Идёт дымок!'; } if (flags->isFlag(MOVE_BACK)){ speed = speedBack; } else { speed = speedNormal; } [/PHP] |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Создаю лендинги на Тильда | 1 | pishu-text | 1977 | 2.10.2020, 13:34 автор: Alex-777 |
Текстовая версия | Сейчас: 25.4.2024, 3:37 |