如何查看某个值的所有活动位?

How to view all active bits for a certain value?

Bitwise operators are those strange looking operators that may look hard to understand...

好吧,他们对我来说不再陌生,但我们也不是永远最好的朋友。 (也许在遥远的未来)。

在使用按位运算符时,我经常发现自己想知道实际设置了哪些位。这让我想知道 PHP 是否有某种功能来查看哪些位对于某个值是活动的。我用谷歌搜索了一下,但找不到。

所以我的最后一个问题是:有没有办法查看某个数字的所有活动位?

What do you mean by active bits?

使用按位运算符将整数转换为二进制数。

一个例子:

16
00010000
35
00100011

我正在寻找这样的东西:

var_dump(showBits(35));

这应该是 return 1、2 和 6,因为它们是活动位。

快速一行:

$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() 函数希望将数字作为字符串传递。参数 102 是您要转换的数字基数。


编辑

根据您的说明,这是一个将整数转换为对应于非零位的值数组的函数:

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));

我想您必须编写自己的函数来执行此操作,例如:

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