无论在哪门语言都老是遇到位运算。之前我懒,加上考试对这块也考的不多,就随便应付过去了,但现在发现Java、Python、sql都可以用位运算来提高一点运算效率,这里简单记下。
首先给出位运算的符号:
符号 | 作用(简要) | 作用(具体) |
---|---|---|
& | 按位与 | 把两个操作数转化为二进制数,然后每位进行位运算,1&1=1, 1&0=0, 0&0=0,可以理解为,都为真才为真 |
| | 按位或 | 把两个操作数都转化为二进制数,然后每位进行位运算,1|1=1, 1|0=1, 0|0=0,可以理解为,至少有一个为真,才为真 |
~ | 按位取反 | 把操作数转化为二进制数,然后按位取反,1变为0,0变为1 |
^ | 按位异或 | 把两个操作数都转化为二进制数,然后每位进行位运算,1^1=0, 1^0=1, 0^0=0,可以理解为,相同的数异或结果为0,不同的数异或结果为1 |
<< | 按位左移 | m<<n,表示m的二进制数向左移n位,右边补上n个0 |
>> | 按位右移 | m>>n,表示m的二进制数向右移n位,左边补上n个符号位 |
>>> | 逻辑右移 | m>>n,表示m的二进制数向右移n位,左边补上n个0 |
以后再补充
22.3.28
这里补充一个例子
刷题遇到的一道题,要求判断一个数的二进制是不是01交替出现。我本来想逐位右移后和1进行&运算来判断的,但一时想不到怎么让右移的循环结束(不想用除法),去参考了下答案,太妙了。
class Solution {
public boolean hasAlternatingBits(int n) {
//假设n符合题意,则n右移1位与n的异或结果为01111111等类似的,即后面全为1
int a = n ^ (n >> 1);
//将a与a+1进行与运算,为0说明n符合题意
return (a & (a + 1)) == 0;
}
}
这里直接对n右移一位,然后和n进行异或运算。比如说n是10101010时,右移一位就变成了01010101,那么异或的结果就是11111111。
把a和a+1进行与运算,则为11111111&00000000,结果肯定为0。这样运算避开了循环的过程,一步到位,真的妙。