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
(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 }
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 }
(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 }
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)。