位运算

运算符 解释 例子(二进制)
$a & $b 与运算。一0则0 10 & 01 = 00
$a | $b 或运算。一1则1 10 | 01 = 11
$a ^ $b 异或。11/00 = 1,10 = 0 10 ^ 01 = 00
~$a 按位取反。1->0 ,0->1 ~100 = 011
$a << $b 将a的位往左移b次,每移动一次就乘以2 1 << 2 = 100
$a >> $b 将a的位往右移b次,每移动一次就除以2 111 << 2 = 1

https://mp.weixin.qq.com/s/8lJNdnJ0tWm2CapiW_u7XA 原创 | 东哥教你几招常用的位运算技巧

几个有趣的位操作

  1. 利用或操作 | 和空格将英文字符转换为小写

    1. ('a' | ' ') = 'a'
    2. ('A' | ' ') = 'a'
  2. 利用与操作 & 和下划线将英文字符转换为大写

    ('b' & '_') = 'B'
    ('B' & '_') = 'B'
    
  3. 利用异或操作 ^ 和空格进行英文字符大小写互换

    ('d' ^ ' ') = 'D'
    ('D' ^ ' ') = 'd'
    
  4. 判断两个数是否异号 ```php <?php $x = -1; $y = 2; $f = (($x ^ $y) < 0));

$x = 3; $y = 2; $f = (($x ^ $y) < 0));


5. 不用临时变量交换两个数
```php
<?php
$a = 1;
$b = 2;
$a ^= $b;
$b ^= $a;
$a ^= $b; # $a = 2; $b = 1;
  1. 加一

    $n = 1;
    $n = -~$n; # n = 2
    
  2. 减一

    $n = 2;
    $n = ~-$n; # n = 1
    

算法常用操作

  • n&(n-1) :作用是消除数字 n 的二进制表示中的最后一个1。

计算汉明权重

191 位1的个数 https://leetcode-cn.com/problems/number-of-1-bits/ 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

<?php 
function hammingWeight($n) {
  $res = 0;
  while($n != 0){
    $n = $n & ($n - 1);
    $res++;
  }
  return $res;
}

判断一个数是不是2的指数

231 2的幂 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1:
2^0 = 1 0001
2^1 = 2 0010
2^2 = 4 0100

<?php
function isPowerOfTwo($n){
    if ($n <= 0) return false;
  return ($n & ($n - 1)) == 0;
}

位运算题目网站:http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel