Java中的位运算符
技术只有落实到工程当中才显得那么有血有肉,之前学J2SE的时候运算符这块没有多在意,前一段时间实现权限管理模块的时候才发觉位运算符内有乾坤。笔者在这里进行简单总结,希望对读者有用。
Java支持的位运算符:
&:按位与。
|:按位或。
~:按位非。
^:按位异或。
<<:左位移运算符。
>>:右位移运算符。
<<<:无符号右移运算符。
这四个运算符比较常见,也比较简单总结如下表所示:
第一个运算符 | 第二个运算符 | 按位与 | 按位或 | 按位异或 |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
PS:对于异或运算符大家可能觉得不太容易记忆(记是永远记不住的),其实前人早就总结了异或的规律,如下所述。
异或:又称半加法运算,例如1异或1可以当成二进制下的1+1=10然后取最后一位,正好是异或的结果,0+0、1+1、0+1同理。
运算原理:
前四种位运算符是比较简单的,只需要按位进行逻辑运算即可例如5&9(结果为1)的执行过程如下:
再比如~-5(结果为4)的执行过程如下:
其他运算(|、~、^)同理。
后面的移位运算相对前面的有些复杂,但是细细研究还是很好理解的。
-5<<2(结果为-20)的执行过程如下:
-5>>2执行过程如下:
-5>>>2的运算过程
通过上面的过程可以看出,只要被移位的二进制码没有发生有效位的数字丢失(对于正数而言,通常指被移出的位全部都是0),不难发现左移n位就相当于乘以2的n次方,右移则是处以2的n次方。还有一点就是进行移位运算不会改变操作数本身,它只是得到了一个新的运算结果,而原来的操作数本身是不会发生改变的。
学而有感:
很多时候学习一些基础的东西总觉得没有意思,甚至感觉有些东西是没有用的。
比如刚接触电脑学习键盘的时候认为end和home键是没什么用的,后来代码敲的多了才发现前人发明这两个键是多么的伟大,这两个键不知为整个人类提高了多少效率。还有这次学习Java的位运算符也是一个典型的例子,当年没觉得这个位运算符有什么用(有点儿鸡肋的感觉),做完了权限模块才发觉它的妙处(具体如何妙用参见我的另一篇博客)。类似的情况还有很多,比如学操作系统、计算机组成、数据结构等等这些基础课程的时候总觉得它们与自己写代码没有多大关系,但是一旦遇到了问题(大数据量,高并发)的时候利用这些“没用”的课程分析代码效率,分析系统资源总能让问题迎刃而解。
不要怀疑现有知识(课程、技术)或者事物的有用性,“存在即合理”如果没用早就被前人淘汰了。用不到某个知识和知识本身无关,不要觉得现在自己用不到就是无用的,现在用不到只能说明自己的水平还不够,要做的就是建立一个“索引”随用随学随研究,如此足矣。