Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Битовая маска

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Использование масок прав
Joe
Отправлено: 19 Января, 2011 - 06:40:04
Post Id



Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




Здравствуйте, подскажите как правильно использовать битовые маски.

Нужно динамически генерировать маску..
Например
PHP:
скопировать код в буфер обмена
  1.  
  2. $res = 100; // Случайное число..
  3. $i = -1;
  4. while ( $i++<17 )
  5. {
  6.     $q = 1 << $i;
  7.     if ( $res & $q ) echo '<b>'.$q.'</b><br />';
  8.     else echo $q.'<br />';
  9. }
  10.  

Маска соответствует 4, 32, и 64
А мне нужно все сразу, или только соответствие 1-ке.
Пробывал так
PHP:
скопировать код в буфер обмена
  1.  
  2. function mask($arr)
  3. {
  4.         $r = 0;
  5.         foreach ($arr as $ar)
  6.         {
  7.                 $p = 1 << $ar;
  8.                 $r |= $p;
  9.         }
  10.         return $r;
  11. }
  12.  

Результат неудовлетворителен(

Читал, но что-то не то


Такая система если не ошибаюсь используется в vBulletin)

Подскажите, куда капать Не понял

(Отредактировано автором: 19 Января, 2011 - 06:43:28)

 
 Top
JustUserR
Отправлено: 19 Января, 2011 - 13:56:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Joe Осуществление создания битовой маски для требуемого устанавливаемого набора параметров определяющих некоторые значения конфигурации в численном виде - может быть основано на генерации обычного целочисленного значения обеспечивающего включение каждого допустимого двоичного параметра как соответствующей степени числа два - в частности осуществляется присвоение элемента включенного i-ого параметра как наличие слагаемого 2^i - и для реализации проверки установленных параметров производится обратное последовательное вычитание После реализаации указанной схемы на основе целочисленных величин - возможна реализация сохранения значений в строковое битовое представление средствами функции pack/unpack


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Joe
Отправлено: 19 Января, 2011 - 17:25:43
Post Id



Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




JustUserR, извиняюсь конечно, но наверное из-за отсутствия ","-й в на вашей клавиатуре, я раз 10 прочел ответ, потом немного его для себя подредактировал..
"примерно так" (Отобразить)

И все равно нечего не понял.. от безысходности решил перекопать скрипт vBulletin.. лучше бы я этого не делал..

В общем, в отчаянии перечитал пост еще раз, так как гугл не давал уже результатов..
И тут до меня наконец-то дошло, истинна была так близка.. и написана была в посте выше.. В общем, маленькая функция
PHP:
скопировать код в буфер обмена
  1.  
  2. function mascka($ar)
  3. {
  4.         $r = 0;
  5.         foreach ( $ar as $t) $r |= 1 ^ $t;
  6.         return $r;
  7. }
  8.  
  9. $vr = mascka(Array(1,8,32,2048));
  10.  

Как раз то, что мне было так нужно, спасибо))

Тему можно закрыть.

P.S. JustUserR, ну и манера выражаться.. Было бы достаточно что-то типа $v |= 1^$i Растерялся
 
 Top
JustUserR
Отправлено: 21 Января, 2011 - 14:48:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Joe пишет:
И все равно нечего не понял..
Предыдущее сообщение в действительности включает информацию - аналогичную предполагаемому вами конечному решению
По сути реализация битовой маски основана на создании некоторого целого числа являющегося суммой i-ых степеней числа 2 - при условии что каждое i-ое слагаемое с весом 2^i отвечает за установку в конфигурации некоторого с индексом i - в то время как отсутствие данного слагаемого означает отсутствие данного параметра
Для удобства хранения и передачи сгенерированного целевого числа ассоциированного с целевым набором конфигурационных параметров - предполагалось использование функции pack


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB