黑马程序员技术交流社区

标题: Java功底——理解位运算符 [打印本页]

作者: Liveei    时间: 2015-8-24 00:00
标题: Java功底——理解位运算符

话题一:异或

先看一段代码吧:

这段代码是用来实现a,b交换的。

异或是位运算符,0^1为1,其他情况都是0,这是一个加法不进位的功能!

这有什么用呢?

其实通过上面交换的例子,我们已经明白A^B^A将得到B,也就是可以实现数据还原的功能!


话题二:%与&

如果有一堆数据,我们想将这些数据通过HASH的方式,放入到桶中。

我们可以将桶进行编号,比如0号,1号,...N号桶。

给我们一个数据,我们要完成这个数据和桶的序号的映射转化关系,这样放入和查找就可以了。

由于对于任何一个非负数A,进行A%B,得到的必然是[0,B-1]区间内,所以我们可以利用%的特性来完成这个转化关系!

其实,&也可以完成这一过程!而且&是CPU级别的位运算,会更快些!

要知道A&B,得到的一定是[0,B]区间内,真是神奇!

因为,&其实是一个置0的操作,比如A&B,也就是说将A的二进制中出现0的位置都反映到B对应的位置上,因此A&B是一个变小的过程!

但是,注意到比如B是10,对应二进制是1010,也就是说不论A是什么,A&B得到的二进制的一号位,三号位必然是0【假设从右至左开始】。那么A&B将取不到一些数,比如3,意味着3号桶将始终得不到数据!因此如果选择&,那么B的二进制一定要是连续的1,不能出现0位。


话题三:|

我们知道LINUX文件的权限可以分为rwx,也就是用三个二进制位就可以表达了,下面要求设计程序实现给定一个数字完成权限的判断。


在涉及到大量的判断的时候,我们可以利用& | 这些位操作来达到目标!


话题四:>>>和<<


>>>是无符号的向右移动,也就是左边空缺的补0。
而>> << 都是有符号的移动,空缺时补符号位的。

>>> >> << 这些都是操作二进制序列移动的,可是我们实际开发中用得到吗?

我们知道,在网络上,发送都是字节流,比如发送int a = 32;

一个int占用4个字节,比如从高到低:B1 B2 B3 B4

对于JAVA而言,将按照从高到低的顺序进行发送;那么显然我们必须能够将一个int分解成B1,B2, B3,B4;同时,在接收方必须知道如何将B1 B2 B3 B4组装成原始的数据!

【不同语言可能发送的字节顺序不一样,比如C/C++可能发送的就是从低到高】

看一段程序吧:


运行结果为:


文章出处:     http://zhangfengzhe.blog.51cto.com/8855103/1685021

作者: 肚小糖    时间: 2015-8-24 00:12
整理的很不错!
作者: taojunqiu225    时间: 2015-8-24 00:16
看起来还不错!
作者: koibiki    时间: 2015-8-24 01:04
总结得很好
作者: 洋葱头头    时间: 2015-8-24 06:46
看到这个就好烦
作者: cat73    时间: 2015-8-24 11:31
楼主你错了一点,求余(%)并非位运算哟。
作者: kevin986745zk    时间: 2015-8-24 11:52
学习一下,谢谢分享!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2