Java中的位运算符与使用技巧总结

1.  (^  异或运算符

运算规则:对两个操作数进行位的异或运算。相同取0,相反取1】。即两操作数相同时,互相抵消

使用技巧:

(1)交换数值。 int a = 10;int b = 20   ===> a^b^a == b, a^b^b == a 

1  int f = 50;
2  int g = 60;
3 
4 f = f^g;
5 g = f^g;
6  f = f^g;
7 System.out.println(f+" "+g);
8 
9  输出结果是:60 50
View Code

(2)对称抵消的传递性。如:int a = 10, int b = 20, int c = 30, int d =40. ===> a^b^c^d^a == b^c^d ,  a^b^c^d^a^b == c^d, a^b^c^d^a^b^c^d = 0.

其中可以用性质2来寻找一个成对的数组中个数为奇数的哪个值。

 1 public static void main(String[] args){
 2 
 3         int array[] = {2,3,4,4,3,5,5,6,6,7,7};
 4 
 5         int a = 0;
 6 
 7         for(int i=0;i<array.length;i++){
 8 
 9             v^=array[i];
10 
11         }    
12 
13         System.out.println("不相同的那个数是:"+v);
14 
15     }
View Code

2.(&)按位与运算符

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;   即:两位同时为“1”,结果才为“1”,否则为0】。另:负数按补码形式参加按位与运算。

使用技巧:

(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

1 public static void main(String[] args) {
2         int a=50;
3         int b=60;
4         System.out.println(a&b&0);//输出 0;
5     }
View Code

(2)取一个数中指定位

方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

例:设X=10101110,

    取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;

    还可用来取X的2、4、6位。

 1  public static void main(String[] args) {
 2         int a = 50;
 3         byte aBit = (byte) a;//00110010
 4         byte lastTwo = (byte) 3;//00000011
 5         byte lastFive = (byte) 31;//00011111
 6         byte result2 = (byte)(aBit & lastTwo);
 7         byte result5 = (byte)(aBit & lastFive);
 8 
 9         System.out.println(Byte.toString(result2));//取50的后2位,---输出2
10         System.out.println(Byte.toString(result5));//取50的后5位,---输出18
11     }
View Code

3.( 按位或运算符

运算规则:0|0=0;   0|1=1;   1|0=1;    1|1=1;即 :参加运算的两个对象只要有一个为1,其值为1。另,负数按补码形式参加按位或运算。

使用技巧:将一个数据的某些位置为1

例如:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。

例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。

4.( ~ )非运算符

运算规则:非运算即取反运算,在二进制中1变0,0变1

110101进行非运算后为001010即1010
int X进行非运算后变为   -(X+1),即~5=-6,~(-5)=4

5.(<<)左移运算符

运算规则:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

例:a = a << 2 将a的二进制位左移2位,右补0,

左移1位后a = a * 2; 

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2

6.(>>)右移运算符

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

操作数每右移一位,相当于该数除以2

例如:a = a >> 2 将a的二进制位右移2位,

左补0 or 补1 得看被移数是正还是负。

7.(>>>无符号右移运算符

>>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。

例如:var temp = -14 >>> 2

变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的00111111 11111111 11111111 11111100)。

猜你喜欢

转载自www.cnblogs.com/yuerugou54/p/12319286.html