位运算
运算符 | 解释 | 例子(二进制) |
---|---|---|
$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 原创 | 东哥教你几招常用的位运算技巧
几个有趣的位操作
利用或操作
|
和空格将英文字符转换为小写('a' | ' ') = 'a'
('A' | ' ') = 'a'
利用与操作
&
和下划线将英文字符转换为大写('b' & '_') = 'B' ('B' & '_') = 'B'
利用异或操作
^
和空格进行英文字符大小写互换('d' ^ ' ') = 'D' ('D' ^ ' ') = 'd'
判断两个数是否异号 ```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;
加一
$n = 1; $n = -~$n; # n = 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