Java千问:Java位运算经典应用(一)

不少人认为位运算在实际开发过程当中并没什么用,学习位运算也只是为了应付面试。这种想法是错误的,接下来咱们就经过几篇连载文章介绍一下位运算在实际开发过程当中的几个经典应用实例。若是对位运算规则掌握还不是很熟练,能够先阅读《Java千问:Java语言位运算符详解》。这篇文章不只详细讲解了Java位运算的基本规则和一些经常使用的运算定律,同时还在文中提到了一些经常使用的位运算实际应用,好比能够用位运算操做的方式快速把某个变量所在的内存单元清零,或者位运算的方式实现某个变量快速倍增等等。但文中所这提到的这几个实际应用比较简单,本次连载文章将为你们讲述的是更加复杂和实际的应用经典案例。此外,为得到更好的阅读效果,请各位读者在读本文以前先熟练掌握”补码”的计算规则。面试

1、判断整数的奇偶性

按照传统的思路,判断一个整数的奇偶性是经过用这个数与2求模,看运算结果是否为0。学了位运算符之后,咱们能够换一种思路来考虑问题。咱们知道:Java语言中,全部数字存储在内存中,都要先转换成补码的形式。任何一个偶数用补码表示出来后,它的最后一个二进制位都是0,而奇数补码的最后一个二进制位都是1。因此,咱们能够经过判断这个整数的补码的最后一位二进制数是0仍是1,来判断这个数是偶数仍是奇数。判断的方法就是用这个数与1进行按位与的操做,若是结果为0,那么这个数就是偶数,不然就是奇数。若是你们不理解这个算法的原理,请看下图:算法

Java千问:Java位运算经典应用(一)
为了方便表述,咱们把要判断奇偶性的数字称为a。图中,以横线为界,分别展现了a为偶数和奇数的状况下,与数字1进行按位与操做的结果。其中,上面的二进制串是a的补码,下面二进制串是数字1的补码。能够看到,数字1被转换成补码以后,总共有32位,其中前31位都是0,最后1位的值是1。这就致使a补码的前31位不管是0仍是1,与数字1的补码进行按位与运算,运算结果的前31位都只能是0,决定最终运算结果的就只有a补码最右边的那个二进制位。若是最右边那一位是0,那么a就是偶数,a与1按位与运算的最终结果是数字0。反过来,若是最右边那一位是1,那么a就是奇数,a与1按位与运算的最终结果是数字1。所以咱们只要看一下a与数字1进行按位与运算的结果就知道a的奇偶性了。具体的程序实现以下:编程

Java千问:Java位运算经典应用(一)

2、求绝对值

常规算法求绝对值的思路是:首先判断一个数a是否>=0,若是a>=0,则返回a自己,不然返回a的相反数。这个过程包含判断和选择两个步骤。若是使用位运算符来实现求绝对值,能够省略掉判断的步骤,直接返回运算结果。下面来说解一下使用位运算符求绝对值的基本原理。咱们知道:任何一个二进制位上的数,与0进行异或运算,运算的结果都与这个二进制位上的数相同。把这个结论扩展一下,从原来某个数的单独的一个二进制位扩展到这个数字自己,能够得出另外两个结论,第一个结论:任何一个整数与0进行异或运算后依然保持不变。若是小伙伴不理解的话,请看下图,咱们以数字5做为例子分析讲解:
Java千问:Java位运算经典应用(一)
另外一个结论:任何一个整数与-1进行异或运算后再加上1,获得的结果就是这个数的相反数。若是不理解的话,仍是看下图,仍然是以数字5分析讲解:
Java千问:Java位运算经典应用(一)
以上两个结论中,第一个结论比较容易理解。咱们简单的解释一下第二个结论的原理。第二个结论可以成立的关键就在于,数字-1用补码的形式表示出来,刚好是一个32位全为1的二进制串。这个二进制串与任何一个其余二进制串进行按位异或运算,均可以达到”取反”的效果,而按照补码的计算规则,一个正数按位取反后再加1,获得的就是它相反数。好比图中的数字5,按位取反以后,再加1获得的就是-5。
至此,咱们已经知道怎样经过位运算的方式得到一个数的相反数了。在《Java千问:Java语言位运算符详解》一文中还讲过:int类型的正数通过带符号右移31位以后,获得的必然是0,而负数通过带符号右移31位获得的是-1。咱们就能够经过右移所获得的这个0或者-1,判断出这个数是正数仍是负数。知道数字的正负属性,而后再用位运算的方式获得这个数自己或者是它的相反数,就能求出这个数的绝对值。按照这个思路,咱们就能够来编写求绝对值的程序了,程序以下:
Java千问:Java位运算经典应用(一)
示例程序中的变量a是int型,若是改成long型,对a带符号右移63位也可有相同的运算效果。ide

(未完待续...)
如想系统学习Java编程,欢迎观看我在本站的视频课程。学习

相关文章
相关标签/搜索