给个例子,就明白了……
public static void main(String[] args){
System.out.println("^:位异域运算,规则相同为0(false),不同为1(true)");
System.out.println(true^true);
System.out.println(true^false);
System.out.println(false^false);
// 相当于 011110
// ^110010
// ---------------------
// 101100 (44)相同为0,不同为1
System.out.println(30^50);
}
===============运行结果=============
^:位异域运算,规则相同为0(false),不同为1(true)
false
true
false
44
首先声明,我是菜鸟,但是这个除了在正则表达式中,其他地方我还真没用过
在正则表达式里边^ 匹配字符串的开始
异或运算符
按位异或运算符
两个操作数中,如果两个相应位相同,则结果为0,否则为1
即:
0^0=0,
1^0=1,
0^1=1,
1^1=0
例如:
00101010^00010111=00111101
1)如果需使用一个整数的某些特定的位翻转,可使用另一个
相应位为1的操作数与原来的整数进行按位异或操作实现。
下面的例子对整数变量
ii的第四位翻转
int
revertFouth=ii^8;
其余位则没有变化
2)通过按位异或运算可以实现两个值的交换。而不使用临
时变量。例如交换两个整数a,b的值可通过下列语句实现:
int
a=15,b=24;
//a的最右边8位为00001111,b的最右边8位为00011000
//a和b其余位为0,下同
a=a^b;
//a的最右边8位为00010111,a=23
b=b^a;
//b的最右边8位为00001111,b=15
a=a^b;
//a的最右边8位为00011000,a=24
*位逻辑运算表达式返回两个操作数中数据长度较长的数据
类型
其中较小的左侧将被填满,若为整数,则填满0,
若为负数,则左侧填满1
首先复习一下异或运算(^)的性质:它满足交换律、结合律。
此处有一个经典的运用:现在有一万(1-10000)的个数
,从中拿掉
一个数,问怎么才能找出拿掉的数
?
设
最初的数组是
A,
拿掉
x
之后的数组是
B,
xor()
是对数组内所有元素做异或,则有:
xor(A)
==
xor(B)
^
x
Fake代码
xor(A)
==
xor(B)
^
x
Fake代码
xor(A)
==
xor(B)
^
x
xor(A)
==
xor(B)
^
x
所以:
xor(B)
^
xor(A)
==
xor(B)
^
xor(B)
^
x
==
0
^
x
==
x
Fake代码
xor(B)
^
xor(A)
==
xor(B)
^
xor(B)
^
x
==
0
^
x
==
x
Fake代码
xor(B)
^
xor(A)
==
xor(B)
^
xor(B)
^
x
==
0
^
x
==
x
xor(B)
^
xor(A)
==
xor(B)
^
xor(B)
^
x
==
0
^
x
==
x
结论:
A
和
B
两个数组共
19999
个数,全部用来做异或,结果就是去掉的那个数
x。
(注:设
A
=
{a1,
a2,
a3,
....
a10000},
则
array_xor(A)
=
a1
^
a2
^
a3
^
...
^
a10000
)