在java中,位运算主要有非
∼
\sim
∼,与
&
\&
&,或
∣
|
∣,异或
∧
\wedge
∧,左移
<
<
<<
<<,右移
>
>
>>
>>,算数右移
>
>
>
>>>
>>>,这么多种。我们只考虑三十二位整数,也就是java中的int类型。将其符合的运算律以及代数结构整理如下:
设
Z
Z
Z是三十二位整数全体。则
∀
x
∈
Z
\forall x \in Z
∀x∈Z,有:
1、
x
+
∼
x
=
−
1
x+\sim x=-1
x+∼x=−1
证明可以由计算机中负数表示方法得到。因为
−
x
=
∼
x
+
1
-x=\sim x+1
−x=∼x+1,所以上式成立。
2、设
x
∈
{
0
,
1
}
x\in\{0,1\}
x∈{0,1},则
x
&
0
=
0
,
x
∣
1
=
1
,
x
&
1
=
x
,
x
∣
0
=
x
x\&0=0, x|1=1, x\&1=x, x|0=x
x&0=0,x∣1=1,x&1=x,x∣0=x并且若
x
,
y
,
z
∈
{
0
,
1
}
x,y,z\in\{0,1\}
x,y,z∈{0,1},则
x
&
y
=
y
&
x
,
x
∣
y
=
y
∣
x
,
(
x
&
y
)
&
z
=
x
&
(
y
&
z
)
,
(
x
∣
y
)
∣
z
=
x
∣
(
y
∣
z
)
x\&y=y\& x, x|y=y|x, \\(x\&y)\&z=x\&(y\&z), (x|y)|z=x|(y|z)
x&y=y&x,x∣y=y∣x,(x&y)&z=x&(y&z),(x∣y)∣z=x∣(y∣z)所以
&
\&
&和
∣
|
∣满足交换律和结合律。用群论的语言就是,
(
{
0
,
1
}
,
&
)
(\{0,1\},\&)
({0,1},&)与
(
{
0
,
1
}
,
∣
)
(\{0,1\},|)
({0,1},∣)是一个交换幺半群(commutative monoid)。即:
(
{
0
,
1
}
,
&
)
(\{0,1\},\&)
({0,1},&)是一个交换幺半群,单位元是
1
1
1,
0
0
0不可逆;
(
{
0
,
1
}
,
∣
)
(\{0,1\},|)
({0,1},∣)是一个交换幺半群,单位元是
0
0
0,
1
1
1不可逆。
3、若 x , y , z ∈ { 0 , 1 } x,y,z\in\{0,1\} x,y,z∈{0,1},考虑分配律,我们有: x & ( y ∣ z ) = ( x & y ) ∣ ( x & z ) x ∣ ( y & z ) = ( x ∣ y ) & ( x ∣ z ) x\&(y|z)=(x\&y)|(x\&z)\\x|(y\&z)=(x|y)\&(x|z) x&(y∣z)=(x&y)∣(x&z)x∣(y&z)=(x∣y)&(x∣z)证明非常简单,只需要对 x x x进行考虑,再结合前面的性质就可以了。所以由上面可知,它们还互相满足分配律。
4、德摩根律: ∼ ( x & y ) = ( ∼ x ) ∣ ( ∼ y ) ∼ ( x ∣ y ) = ( ∼ x ) & ( ∼ y ) \sim (x\& y)=(\sim x)| (\sim y)\\\sim (x| y)=(\sim x)\& (\sim y) ∼(x&y)=(∼x)∣(∼y)∼(x∣y)=(∼x)&(∼y)
由于位运算是把两个int的每个数的每一位单独拿出来分别对应的做运算,所以上面的性质对任意int的 x x x和 y y y都是成立的,但是要按照计算机里的二进制表示稍微改动一下: ∀ x ∈ Z , x & 0 = 0 , x ∣ ( − 1 ) = − 1 , x & ( − 1 ) = x , x ∣ 0 = x \forall x\in Z, x\&0=0, x|(-1)=-1, x\&(-1)=x, x|0=x ∀x∈Z,x&0=0,x∣(−1)=−1,x&(−1)=x,x∣0=x交换律结合律分配律仍然保持正确。
4、以上看出来,
&
\&
&和
∣
|
∣的性质还不够好,不过
∧
\wedge
∧的性质就相当好了。我们有这样的结论:
(
{
0
,
1
}
,
∧
)
(\{0,1\},\wedge)
({0,1},∧)是个阿贝尔群。
证明:封闭性显然,交换律显然,
0
0
0是单位元,且两个元素的阶都是
2
2
2,也就是逆元都是自己。结合律证明如下:由于
x
∧
y
=
(
x
&
∼
y
)
∣
(
∼
x
&
y
)
x\wedge y=(x\&\sim y)|(\sim x\&y)
x∧y=(x&∼y)∣(∼x&y),所以:
(
x
∧
y
)
∧
z
=
(
(
x
&
∼
y
)
∣
(
∼
x
&
y
)
)
∧
z
=
(
(
(
x
&
∼
y
)
∣
(
∼
x
&
y
)
)
&
∼
z
)
∣
(
∼
(
(
x
&
∼
y
)
∣
(
∼
x
&
y
)
)
&
z
)
=
(
x
&
∼
y
&
∼
z
)
∣
(
∼
x
&
y
&
∼
z
)
∣
(
x
&
y
&
z
)
∣
(
∼
x
&
∼
y
&
z
)
=
(
x
&
(
(
∼
y
&
∼
z
)
∣
(
y
&
z
)
)
)
∣
(
∼
x
&
(
(
y
&
∼
z
)
∣
(
∼
y
&
z
)
)
)
=
(
x
&
∼
(
y
∧
z
)
)
∣
(
∼
x
&
(
y
∧
z
)
)
=
x
∧
(
y
∧
z
)
(x\wedge y)\wedge z=((x\&\sim y)|(\sim x\&y))\wedge z\\=(((x\&\sim y)|(\sim x\&y))\&\sim z) |\\ (\sim((x\&\sim y)|(\sim x\&y))\& z)\\=(x\&\sim y\&\sim z)|(\sim x\& y\&\sim z)|\\(x\& y\& z)|(\sim x \&\sim y \& z)\\=(x\&((\sim y \& \sim z)|(y\& z)))|\\(\sim x\&((y \& \sim z)|(\sim y\& z)))\\=(x\&\sim (y\wedge z))|(\sim x\& (y\wedge z))\\=x\wedge (y\wedge z)
(x∧y)∧z=((x&∼y)∣(∼x&y))∧z=(((x&∼y)∣(∼x&y))&∼z)∣(∼((x&∼y)∣(∼x&y))&z)=(x&∼y&∼z)∣(∼x&y&∼z)∣(x&y&z)∣(∼x&∼y&z)=(x&((∼y&∼z)∣(y&z)))∣(∼x&((y&∼z)∣(∼y&z)))=(x&∼(y∧z))∣(∼x&(y∧z))=x∧(y∧z)所以结合律成立。所以
(
{
0
,
1
}
,
∧
)
(\{0,1\},\wedge)
({0,1},∧)是个阿贝尔群。
5、关于左移和右移,有两个很显然的结论: x > > 1 = x / 2 x>>1=x/2 x>>1=x/2,以及 x < < 1 = 2 x x<<1=2x x<<1=2x。这里要注意 x x x的范围,操作没有溢出的话等式是对的,否则需要仔细考虑。
6、接下来是两个常用的位运算操作:
求
x
x
x的从右向左数第
i
i
i位是什么(
i
i
i从
0
0
0开始计数):
(
x
>
>
i
)
&
1
(x>>i)\&1
(x>>i)&1;
求
x
x
x的从右向左数第
1
1
1个
1
1
1出现的位置代表的数是几:
l
o
w
b
i
t
(
x
)
=
x
&
−
x
lowbit(x)=x\&-x
lowbit(x)=x&−x。这个结论可以由
−
x
=
∼
x
+
1
-x=\sim x+1
−x=∼x+1得到。
7、位运算与集合构造。给定一个集合,设有 n n n个元素,那么其子集可以由一个 n n n位二进制数来表示,每一位就代表相应位置的元素是否在这个子集中。对于子集 a a a和 b b b,它们的并,交和对称差可以由 a ∣ b a|b a∣b, a & b a\& b a&b和 a ∧ b a\wedge b a∧b来表示。