Как просмотреть все активные биты для определенного значения?

Побитовые операторы — это те странно выглядящие операторы, которые могут показаться сложными для понимания …

Ну, они уже не странно смотрят на меня, но мы тоже не лучшие друзья навсегда. (Возможно в далеком будущем).

Работая с побитовыми операторами, я часто задаюсь вопросом, какие биты на самом деле установлены. Это заставило меня задуматься, есть ли в PHP какая-то функция для просмотра активных битов для определенного значения. Я немного погуглил, но ничего не нашел.

Итак, мой последний вопрос: есть ли способ просмотреть все активные биты для определенного числа?

Что вы подразумеваете под активными битами?

Используя побитовые операторы, целое число переводится в двоичное число.

Пример:

16
00010000
35
00100011

Я ищу что-то вроде этого:

var_dump(showBits(35));

Это должно вернуть 1, 2 и 6, потому что это активные биты.

-1

Решение

Я полагаю, вам придется написать свою собственную функцию, например:

$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
)
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],

1

Я не уверен, что понимаю, о чем вы просите, но вы можете преобразовать число в двоичное представление следующим образом:

$n = 12345678;
$b = base_convert("$n",10,2);  // $b = "101111000110000101001110"

Обратите внимание на кавычки вокруг $nbase_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));
0
По вопросам рекламы [email protected]