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