我发现自己对于位运算的掌握有些薄弱,所以决定写一篇博客来详细说一说位运算。位运算包括左移运算,右移运算,与运算,或运算,非运算,异或运算。下面我来详细说一说这些运算。
1.左移运算 符号为<<
左移运算是将所有二进制数向左移动一位,空缺出来的位置补零。
比如原来的 0000 0011=3
左移一位变成 0000 0110=6
再左移一位变成 0000 1100=12
我们可以发现每次左移完毕数值会扩大2倍。
2.右移运算 符号为>>
右移运算是将所有二进制数值向右移动一位,空缺出来的位置补什么数值由原来这个位置的数值决定,原来是1则补1,原来是0则补0。
比如原来的 0000 1100=12
右移一位变成 0000 0110=6
再右移一位变成 0000 0011=3
再比如原来的 1100 0000=192
右移一位变成 1110 0000=224
再右移一位变成 1111 0000=240
我们可以发现每次右移完毕数值不确定大小
第二种右移运算符 符号为>>>
空缺出来的位置补什么数值不由原来位置的数值决定,不管原来是1还是0都补充0
这种移动每次移动完毕数值都会减小2倍
3.与运算 符号是&
1&1=1
1&0=0
0&1=0
0&0=0
4.或运算 符号是|
1|1=1
1|0=1
0|1=1
0|0=0
5.非运算 符号是~
~1=0
~0=1
6.异或运算 符号是^
异或规则就是两个数相同则为0,两个数不相同则为1
7.如何用位运算交换两个数值呢,我了解到交换数值有三种版本
普通版:
temp=a;
a=b;
b=temp;
进阶版:
a=a+b;
b=a-b;
a=a-b;
高级版:
a=a^b; //此时a=a^b;b=b;
b=a^b; //此时b=a^b^b=a;a=a^b;
a=a^b; //此时a=a^b^a=b;b=a;
上面运算用到的异或的特点就是m^n^n=m;
举个例子 0000 0110=6;
0000 1100=12;
那么 12^6 = 0000 1010=10;
10^6 = 0000 1100 =12;
所以 12^6^6=12;