Побитовые операторы — это те странно выглядящие операторы, которые могут показаться сложными для понимания …
Ну, они уже не странно смотрят на меня, но мы тоже не лучшие друзья навсегда. (Возможно в далеком будущем).
Работая с побитовыми операторами, я часто задаюсь вопросом, какие биты на самом деле установлены. Это заставило меня задуматься, есть ли в PHP какая-то функция для просмотра активных битов для определенного значения. Я немного погуглил, но ничего не нашел.
Итак, мой последний вопрос: есть ли способ просмотреть все активные биты для определенного числа?
Что вы подразумеваете под активными битами?
Используя побитовые операторы, целое число переводится в двоичное число.
Пример:
16
00010000
35
00100011
Я ищу что-то вроде этого:
var_dump(showBits(35));
Это должно вернуть 1, 2 и 6, потому что это активные биты.
Я полагаю, вам придется написать свою собственную функцию, например:
$val = 35;
$bitsVal = strrev(base_convert($val,10,2));
$activeBits = [];
foreach (str_split($bitsVal) as $key => $bit) {
if ($bit == 1) $activeBits[] = $key; // $key + 1 depending on what you want
}
print_r($activeBits);
Выход :
Array
(
[0] => 0 // 1
[1] => 1 // 2
[2] => 5 // 6 with $key + 1
)
Быстрый однострочник:
$result = array_keys(array_filter(array_reverse(str_split(decbin(35)."0"))));
print_r($result);
Array
(
[0] => 1
[1] => 2
[2] => 6
)
Угробить ."0"
если вы предпочитаете видеть их с нулевым индексом, например [0, 1, 5]
,
Я не уверен, что понимаю, о чем вы просите, но вы можете преобразовать число в двоичное представление следующим образом:
$n = 12345678;
$b = base_convert("$n",10,2); // $b = "101111000110000101001110"
Обратите внимание на кавычки вокруг $n
— base_convert()
Функция ожидает, что число будет передано в виде строки. Параметры 10
а также 2
являются базами чисел, между которыми вы конвертируете.
РЕДАКТИРОВАТЬ
После вашего пояснения, вот функция, которая преобразует целое число в массив значений, соответствующих ненулевым битам:
function showBits($n) {
$b = base_convert("$n",10,2);
$a = array();
for ($j=1,$i=strlen($b)-1;$i>=0;$j++,$i--) {
if ($b[$i]=="1") $a[]=$j;
}
return $a;
}
// Example of use:
var_dump(showBits(35));