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
Форумы портала PHP.SU :: Версия для печати :: Битовая маска
Форумы портала PHP.SU » PHP » Программирование на PHP » Битовая маска

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

1. Joe - 19 Января, 2011 - 06:40:04 - перейти к сообщению
Здравствуйте, подскажите как правильно использовать битовые маски.

Нужно динамически генерировать маску..
Например
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)

Подскажите, куда капать Не понял
2. JustUserR - 19 Января, 2011 - 13:56:44 - перейти к сообщению
Joe Осуществление создания битовой маски для требуемого устанавливаемого набора параметров определяющих некоторые значения конфигурации в численном виде - может быть основано на генерации обычного целочисленного значения обеспечивающего включение каждого допустимого двоичного параметра как соответствующей степени числа два - в частности осуществляется присвоение элемента включенного i-ого параметра как наличие слагаемого 2^i - и для реализации проверки установленных параметров производится обратное последовательное вычитание После реализаации указанной схемы на основе целочисленных величин - возможна реализация сохранения значений в строковое битовое представление средствами функции pack/unpack
3. Joe - 19 Января, 2011 - 17:25:43 - перейти к сообщению
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 Растерялся
4. JustUserR - 21 Января, 2011 - 14:48:08 - перейти к сообщению
Joe пишет:
И все равно нечего не понял..
Предыдущее сообщение в действительности включает информацию - аналогичную предполагаемому вами конечному решению
По сути реализация битовой маски основана на создании некоторого целого числа являющегося суммой i-ых степеней числа 2 - при условии что каждое i-ое слагаемое с весом 2^i отвечает за установку в конфигурации некоторого с индексом i - в то время как отсутствие данного слагаемого означает отсутствие данного параметра
Для удобства хранения и передачи сгенерированного целевого числа ассоциированного с целевым набором конфигурационных параметров - предполагалось использование функции pack

 

Powered by ExBB FM 1.0 RC1