2017-01-12 3 views
0

У меня есть битовая маска так:Объединить установку двух бит в битовой маске

$mask = 0; 
$mask |= 1 << 2; 
$mask |= 1 << 9; 

print decbin($mask); 

В результате 1000000100 чего я хочу. Мне просто интересно, есть ли способ включить оба бит 2 и 9 за одну операцию? Так что это выглядит следующим образом:

$mask = 0; 
$mask |= 1 << (... enable 2 and 9 ...); 

print decbin($mask); 
+0

Я не знаком с PHP, но если битовые операции и маски совсем подобно тому, как они на других языках, то вы можете | = ваш номер с гексагоном 204, который составляет 1000000001 или 516 base 10. – synchronizer

ответ

0

Это дает тот же результат:

print decbin(1 << 2 | 1 << 9); 
  • 1 << 2 приводит 4.
  • 1 << 9 Результаты 512.
  • 512 + 4 = 516
  • decbin(516) = 1000000100

Теперь это не обычный || заявление вы делаете следующее:

101001 | 010110 = 111111 
41  + 22  = 63 

Таким образом, в терминах непрофессионалов, вы» повторное объединение значений.

Вы могли бы существенно положить его в функцию:

function bit_shiftlist(array $nums = [], bool $left = true){ 
    $ret = 0; 
    foreach($nums as $value){ 
    $ret += $left ? 1 << $value : 1 >> $value; 
    } 

    return $ret; 
} 

$mask = bit_shiftlist([2, 9]); 

var_dump($mask);  // 516 
var_dump($mask^512); // 4 
var_dump($mask^4); // 512 
var_dump($mask & 4); // 4 
var_dump($mask & 8); // 0 - unexisting bit in both value 512 and 4. 
+0

Почему он дает тот же результат? Что делает одна труба? Согласно документации [поразрядные операторы] (http://php.net/manual/en/language.operators.bitwise.php), '|' является инклюзивным OR, который, похоже, не даст желаемых результатов ... –

+0

Что останавливает вас от '| =' заданного числа с 0x204? – synchronizer

+0

Интересное решение, @synchronizer, как бы вы достигли 204? – Max

Смежные вопросы