X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Тильда
Letmetouchyou
Letmetouchyou
Topic Starter сообщение 24.5.2011, 22:34; Ответить: Letmetouchyou
Сообщение #1


Какое ёё практическое применение?

Тильда - Performs the NOT operator on each bit. То есть инвертирует все биты.

[JS]!~(-2) = false

!~(-1) = true

!~(0) = false

!~(1) = false

!~(2) = false [/JS]

вотп ример использования
[JS]var str = 'posterous';

if ( !~str.search('t') ) {
// character 't' not found branch
}
else{
// found branch
}[/JS]
но все равно идея эта мне не ясна.) Прошу разьяснить
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 24.5.2011, 23:25; Ответить: alexdrob
Сообщение #2


(Letmetouchyou @ 25.5.2011, 01:34) *
Какое ёё практическое применение?

Без неё сложно будет обойтись при работе с битовыми масками, как сбросить бит?
[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
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
Letmetouchyou
Topic Starter сообщение 25.5.2011, 1:55; Ответить: Letmetouchyou
Сообщение #4


pavelsc, ну ето я понимаю, вот только на практике как не пойму, где ето полезно(
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
Topic Starter сообщение 25.5.2011, 1:56; Ответить: Letmetouchyou
Сообщение #5


alexdrob, не очень ясен пример(

m_flags |= v;

что тут занчит " |= "?

return m_flags & v;
и тут " & "?



p.s. какето беда случилась. первый раз встречаю такие консрукции. а все после прочтения этой статьи.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
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
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
Letmetouchyou
Topic Starter сообщение 25.5.2011, 3:31; Ответить: Letmetouchyou
Сообщение #8


(alexdrob @ 25.5.2011, 05:35) *
|= - это то же что и user->flag = user->flag | GROUP_REG

ну что a |= b тоже самое что a = a | b ето логично понтяно.
а вот математический смысл мне не ясен. Тоже самое и с &

А за все остальное, alexdrob, Apay, спасибо. Вроде полегчало)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Letmetouchyou
Letmetouchyou
Topic Starter сообщение 25.5.2011, 3:33; Ответить: Letmetouchyou
Сообщение #9


никогда в жизни не учил обычное програмирование. имею ввиду програмшина для пк и так далее. (с/с++ асемблер). И часто бывают не понятки с подобными вещами.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 25.5.2011, 3:58; Ответить: alexdrob
Сообщение #10


(Letmetouchyou @ 25.5.2011, 06:31) *
а вот математический смысл мне не ясен.

есть биты
[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]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Создаю лендинги на Тильда
1 pishu-text 1977 2.10.2020, 13:34
автор: Alex-777


 



RSS Текстовая версия Сейчас: 25.4.2024, 3:37
Дизайн