PHP 操作符

按位左移赋值运算符 (<<=) 为第一个操作数分配一个等于两个操作数按位左移运算结果的值。

(x <<= y) 等价于 (x = x << y)

按位左移运算符 (<<) 将两个数字向左移动第一个操作数的位数由第二个操作数指定的位置。例如:要将x的位左移y位,可以使用表达式(x<<y)。它相当于将x乘以2y

下面的示例描述了如何左移运算符的工作原理:

1000 << 2 returns 4000

                      (In Binary)
   1000         ->    1111101000  
   << 2                     |  left shift the bits
   -----                    V  by 2 places
   4000         <-  111110100000 
                      (In Binary) 

使用左移运算符(<<)的代码如下:

<?php
$x = 1000;

//左移赋值操作
$x <<= 2;

//显示结果
echo "x = $x";
?> 

上述代码的输出将是:

x = 4000 

示例:统计正整数中 1 位的个数

考虑一个整数 1000。按位格式可以写为 1111101000。但是,并不是所有位都写成这里。完整的表示将是 32 位表示,如下所示:

00000000000000000000001111101000 

在任何位上与 1 进行按位 AND 运算,如果该位为 1,则结果为 1;如果该位为 0,则结果为 0。对每一位进行操作,并计算 1 的个数,得出给定正整数中 1 位的计数。要实现此按位左移赋值运算符,可以使用如下例所示:

<?php
function CountOneBits($n) {
  $mask = 1;
  $count = 0;
  
  //按位与运算
  //数字的每一位
  for($i = 0; $i < 32; ++$i) { 
    if(($mask & $n) == $mask) 
      $count++;
    $mask <<= 1;
  }
  return $count;
}

echo "CountOneBits(1000) = ".
  CountOneBits(1000)."\n";
echo "CountOneBits(1023) = ".
  CountOneBits(1023)."\n";   
?> 

上面的代码将给出以下输出:

CountOneBits(1000) = 6
CountOneBits(1023) = 10