你的位置:澳门网 > 技术专栏 >

Java位运算原理及使用讲解

2018-11-23 19:46 点击:

  日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法。举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1。可能的做法是使用三木运算符,判断原始值为1还是0,如果是1,设置为0,否则设置为0.但是使用位运算,不用判断原始值,直接改变值就可以:

  当然,一条语句可能对代码没什么影响,但是在高重复,大数据量的情况下将会节省很多开销。

  以下是自己整理的关于java位运算的部分内容,如有错误,还请指出,以共同进步,先行致谢。

  位运 算 符 中 ,除 ~ 以 外 ,其余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和字 符 型 数 据 。

  规则总结:只有两个操作数对应位同为1时,结果为1,其余全为0. (或者是只要有一个操作数为0,结果就为0)。

  规则总结:只有两个操作数对应位同为0时,结果为0,其余全为1.(或者是只要有一个操作数为1,结果就为1)。

  当移动的位数超过数字本身的位数时,那么不就都需要补0操作,实际上不是的,java不可能做那么浪费资源的事情。在真正执行位移前,其对要移动的位数做了一些预处理,比如32处理为0,-1处理为31.

  低位溢出,符号位不变,并用符号位补溢出的高位。如:-62结果为-2。

  低位溢出,高位补0。注意,无符号右移()中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-11结果为2147483647。这个数字应该比较熟悉,看两个输出语句就知道是什么了:

  计算结果是不是很正确呢?如果非要说2-1为什么不等于0.5,前面说过,位运算的操作数只能是整型和字符型。在求int所能表示的最小值时,可以使用

  可以发现左移31位和-1位所得的结果是一样的,同理,左移30位和左移-2所得的结果也是一样的。移动一个负数位,是不是等同于右移该负数的绝对值位呢?输出一下就能发现不是的。java中int所能表示的最大数值是31位,加上符号位共32位。在这里可以有这样的位移法则:

  法则二:在位移运算mn的计算中,若n为正数,则实际移动的位数为n%32,若n为负数,则实际移动的位数为(32+n%32),右移,同理。

  为什么与1能判断奇偶?所谓的二进制就是满2进1,那么好了,偶数的最低位肯定是0(恰好满2,对不对?),同理,奇数的最低位肯定是类型的1,前31位都是0,无论是1&0还是0&0结果都是0,那么有区别的就是1的最低位上的1了,若n的二进制最低位是1(奇数)与上1,结果为1,反则结果为0.

  任何数异或本身结果为0.且有定理a^b=b^a。异或是一个无顺序的运算符,则b^a^b=b^b^a,结果为0^a。

  可以发现,异或0具有保持的特点,而异或1具有翻转的特点。使用这些特点可以进行取数的操作。

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

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

  在日常的java开发中位运算使用的不是很常见,但是面试或考试中会有涉及的地方,虽然不是决定项,但却是加分项,说明对计算机语言有最起码的了解。而且在高级算法中,位运算往往能优化算法运行效率,减少运行时间。再比如,有一张全是选择题或是勾选题(类似判断)的试卷,你是使用每个选项一条记录的形式保存答案还是使用一个二进制对应的整数来保存答案?就像是英语考试中的答题卡:

  每个题目有4个选项,每个选项有两个状态:选、不选(1、0),那么此时是不是可以使用4位二进制数来表示某题的答案呢?

  最近有些心浮气躁,还是太年轻——感觉some lost。似乎有些话说出来就好了,即使是从键盘上敲到这里,然后再bs掉。为自己的坚持鼓掌。

  最近又回去重新看了java基础的书籍,在记录总结以前一些比较容易混淆的知识点。下面是本篇要记录的内容 一、 相关基础概念 在开始java位运算的知识之前,我们先来了解几个基础的概念,机器数,真值,原...来自:zejian的博客

  此文大部分内容来自 感谢作者) 此文是在作者及网络基础上的总结,希望可以帮助还不了解位...来自:XiaoJL博客

  java按位运算符(操作符) 最近在看源码时,发现一些java基础忘了,今天来回忆,整理一下            按位运算符是来操作整数基本数据类型中的单个“比特”(bir),即二进制位,位运算符回...来自:mxiaoyem的博客

  回顾首先来回顾一下这些运算: - &(与运算):只有当两方都为 true 时,结果才是 true,否则为 false。 - (或运算):只要当一方为 true 时,结果就是 true,否则为 f...来自:Airsaid

  位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面...来自:阳光灿烂的日子的博客

  转载请注明原创出处,谢谢! 说在前面 之前在JVM菜鸟进阶高手之路十(基础知识开场白)的时候简单提到了二进制相关问题,最近在看RocketMQ的源码的时候,发现涉及二进制的内容蛮多,jdk源码里面...来自:最简单的东西,往往包含了最复杂的实现。

  简介 所谓socket 通常也称作**套接字**,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常**通过套接字向网络发出请求或者应答网络请求**。 以J2SDK-1.3为例,Soc...来自:王者之峰

  介绍了Socket编程的基本概念,并以UDP编程为例,给出示例。来自:我的天空 我的梦

  第一节 网络基础简介 这里我们首先先简单介绍一下socket编程的基础知识,Java对网络提供了高速的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中使用最多的就是socket,大家所熟悉的...来自:yuqnfendetiankong的博客

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个socket。socket也就是套接字,可以用来实现不同虚拟机或者不同计算机之间的通信。在Java语言中,socket可...来自:wuxiaosi808的博客

  这几天在看HashMap的源码,但里面的位运算太多,看得有点晕。故,先整理位运算相关知识。 在了解位运算的计算后,又在思考,使用位运算的意义是什么,毕竟平时开发基本没用过位运算。经大量的资料查找,整...来自:真正的大师永远怀着一颗学徒的心

  前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力。今天...来自:※老鼠拧刀满街找猫※

  按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算。 运算规则:0   0    1     1        即:两位同时为“1”,结果才...来自:码小农的博客

  序 能否利用位运算高效的实现部分算法是面试中的常见考题,现在讲该部分总结如下。 一、不用额外变量交换两个整数的值 void exchange(int &a , int &b) { if(a == b...来自:指尖飞舞

  最近,由于工作原因在编写教材时,对java的位运算进行了深入了解,现记录如下。      首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作。主要包括位与、位或、...来自:tonysong111073的专栏

  在java的位运算符中有一个异或的运算符,用符号(^)表示,其运算规则是:在两个二进制操作数的相同位中,相同则结果为0,不同则结果为1。例如:0011^1010 = 1001         2^3 ...来自:javaisnotgood的博客

  先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换。赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样。第一题:...来自:LiQiyao的博客

  面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对...来自:ztj111的专栏

  CSDN的老朋友、连续两届CSDN博客之星、微软MVP、博客排名52位、在中国传媒大学通信与信息系统专业攻读博士的雷霄骅,于2016年7月17日凌晨猝死在学校主楼五层,并于7月23号安葬。据相关报道称...来自:博客

  现在有一个需求,就是要去给一台客户端主动去发送指令,或者推送消息,就寻求朋友问了问告诉我说socket可以实现,所以就在网上找了些资料一遍学习,一遍测试,现在把我最后的成果记录下来。 ...来自:Mars_wen的博客

  /* * 题目 给出两个整数a和b, 求他们的和, 但不能使用+等数学运算符。 注意事项 你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。 说明 ...来自:小陈的博客

  这里笔者介绍一种很常用,也比较专业的权限控制思路。这里用java语言描述,其实都差不多的。要换成其他的语言主,自己转一下就可以了。为了方便起见,我们这里定义a^b为:a的b次方。这里,我们为每一个操作...来自:DuceXu的专栏

  本篇文章给大家讲解编程软件中的运算符底层实现原理! 1.按位与运算& 按位与运算的底层运算过程如下 十进制: 3&5=1 二进制 3: 0011 ...来自:17岁boy的博客

  与位运算相关的编程算法技巧的总结java实现,从6个经典的问题出发,总结了位运算的技巧。...来自:A784586的专栏:任何事都存在 Plan B !

  (1)       m 数乘2n:相当于数左移n位;注意,除操作慎用右移,注意负数情况。 (2)       mn:右移—最右边n位丢弃,最左边0补位(无符号)/符号位补最左边。 **利用右...来自:Wanna的博客

  在最近学习C语言,接触到不少底层知识。之前一直用Java开发,很少会用到像位运算这样的操作。 通过C语言的学习,才发现位运算真是奇妙,除了简单的类似位反转等基本操作,还可以加密编码, 交换变量值,...来自:西代零零发

  面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点首先让我们来了解一...来自:poison6的博客

  1) “有符号”左移位运算符()能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。左移移位相当于乘以2,例如3 2 //12 则是将数字3左移2位 3*2*2 = 3...来自:qianfeng_dashuju的博客

  第一节 网络基础简介这里我们首先先简单介绍一下socket编程的基础知识,java对网络提供了高速的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中使用最多的就是socket,大家所熟悉的网络...来自:不积跬步,无以千里

  本书作为算法领域经典的参考书,全面介绍了关于算法和数据结构的知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。第4 版具体给出了每位程序员应知应会的50 个算法,提供了实际代码,而且这些Java 代码实现采用了模块化的编程风格,读...

  u011904605:9月份我封装的一个位运算状态机,功能有增,删,改,查,比较,支持多线程操作,感兴趣的可以看下git...

  DuanQingCI:在单表情况下,视图修改数据,原表受到影响。那原表修改数据,视图要进行手动修改,还是会自动修改呢。(...

  :按位与按位或:有一个1就是1;按位非~:0变1,1变0;按位异或^:不同...