JAVA语言之Java基础-一文搞懂位运算
小标 2019-02-28 来源 : 阅读 983 评论 0

摘要:本文主要向大家介绍了JAVA语言之Java基础-一文搞懂位运算,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之Java基础-一文搞懂位运算,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

JAVA语言之Java基础-一文搞懂位运算

在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+、-、*、/、%)、关系运算(<、>、<=、>=、==、!=)和逻辑运算(&&、||、!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用。


1、 位运算起源


  位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来。所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效的。在简单的低成本处理器上,通常位运算比除法快得多,比乘法快几倍,有时比加法快得多。虽然由于较长的指令流水线和其他架构设计选择,现代处理器通常执行加法和乘法的速度与位运算一样快,但由于资源使用减少,位运算通常会使用较少的功率,所以在一些Java底层算法中,巧妙的使用位运算可以大量减少运行开销。


2、 位运算详解


  Java位运算细化划分可以分为按位运算和移位运算,见下表。

JAVA语言之Java基础-一文搞懂位运算

各二进制位全部右移N位,无论正负,都在高位插入0


  在进行位运算详解之前,先来普及下计算机中数字的表示方法。对于计算机而言,万物皆0、1,所有的数字最终都会转换成0、1的表示,有3种体现形式,分别是:原码、反码和补码。


  原码:原码表示法在数字前面增加了一位符号位,即最高位为符号位,正数位该位为0,负数位该位为1.比如十进制的5如果用8个二进制位来表示就是00000101,-5就是10000101。


  反码:正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。5的反码就是00000101,而-5的则为11111010。


  补码:正数的补码是其本身,负数的补码在其原码的基础上,符号位不变,其余各位取反,最后+1。即在反码的基础上+1。5的反码就是00000101,而-5的则为11111011。


  了解了这几个概念后,我们现在先记住一个结论,那就是在计算机系统中,数字一律用补码来表示、运算和存储,具体的原因可以看这篇文章的讨论,这里不做更多讨论,因为不是本文的重点。


2.1 与运算(&)


  规则:转为二进制后,两位为1,则结果为1,否则结果为0。


  举例:


JAVA语言之Java基础-一文搞懂位运算

2.2 或运算(|)


  规则:转为二进制后,有一位为1,则结果为1,否则结果为0。


  举例:

JAVA语言之Java基础-一文搞懂位运算

2.3 非运算(~)


  规则:转为二进制后,~0 = 1,~1 = 0。


  举例:

JAVA语言之Java基础-一文搞懂位运算


2.4 异或运算(^)


  规则:转为二进制后,两位不相同,结果为1,否则为0。


  举例:

JAVA语言之Java基础-一文搞懂位运算

2.5 左移运算(<<)


  规则:转为二进制后,各二进制位全部左移N位,高位丢弃,低位补0。


  举例:

JAVA语言之Java基础-一文搞懂位运算

2.6 右移运算(>>)


  规则:转为二进制后,各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1。


  举例:

JAVA语言之Java基础-一文搞懂位运算

2.7 无符号右移运算(>>>)


  规则:转为二进制后,各二进制位全部右移N位,无论正负,都在高位插入0。


  举例:

JAVA语言之Java基础-一文搞懂位运算

3、 应用


3.1 不用额外的变量实现两个数字互换


  见参考资料中的BitOperationTest,方法reverse通过三次异或操作完成了两个变量值的替换。


  证明很简单,我们只需要明白异或运算满足下面规律(实际不止如下规律):


  0^a = a,a^a = 0;


  a ^ b = b ^ a;


  a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;


  a ^ b ^ a = b;


  假设a,b两个变量,经过如下步骤完成值交换:a=a^b,b=b^a,a=a^b。


  证明如下:


  因为a ^ b = b ^ a,又a=a^b,b=b^a。故b=b^a= b^ (a^b)=a。


  继续a=a^b,a=(a^b) ^ b^ (a^b),故a=b。完成值交换。


3.2 不用判断语句实现求绝对值


  公式如下:(a^(a>>31))-(a>>31)


  先整理一下使用位运算取绝对值的思路:若a为正数,则不变,需要用异或0保持的特点;若a为负数,则其补码为原码翻转每一位后+1,先求其原码,补码-1后再翻转每一位,此时需要使用异或1具有翻转的特点。


  任何正数右移31后只剩符号位0,最终结果为0,任何负数右移31后也只剩符号位1,溢出的31位截断,空出的31位补符号位1,最终结果为-1.右移31操作可以取得任何整数的符号位。


  那么综合上面的步骤,可得到公式。a>>31取得a的符号,若a为正数,a>>31等于0,a^0=a,不变;若a为负数,a>>31等于-1 ,a^-1翻转每一位。


3.3 判断一个数的奇偶性


  通过与运算判断奇偶数,伪代码如下:


  n&1 == 1?”奇数”:”偶数”


  奇数最低位肯定是1,而1的二进制最低位也是1,其他位都是0,所以所有奇数和1与运算结果肯定是1。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程