java位操作_关于java按位操作运算
<1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系:
举例15和-15:
15 的原码: 00000000 00000000 00000000 00001111
补码: 11111111 11111111 11111111 11110000
+1 =
-15的原码:11111111 11111111 11111111 11110001
负数的原码即为:正数的原码取反,再加1。
<2>位移操作:(只针对 int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可以作用于以下类型,即 byte,short,char,long(当然,它们都是整数形式)。当为这四种类型是,JVM先把它们转换成int型再进行操作。
<
>> 右移
>>> 无符号右移
<< 和>>为数值位移,>>>为逻辑位移。【注】:Java中不存在<<
$1> m<
实例:
3<<2剖析:
3二进制形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即为12.
左移使整数变为负数:
10737418<<8
10737418二进制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.
$2> m>>n的含义:把整数m表示的二进制数右移n位,m为正数,高位全部补0;m为负数,高位全部补1. 算术右移 有符号右移
实 例:
3>>2剖析:
3二进制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.
-3>>2剖析:
-3二进制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.
以上:每 个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。
备注:对于右移32位与右移0位是结果是一样的,我一直不能够理解。现在我只能理解为32比较特殊。相当于整体全移。与移0位相同。左移也是一样的。
$3> m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补零。逻辑右移 无符号右移
实例:
3>>>2剖析:
3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.
-3>>>2剖析:
-3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.
【注】:对于$1,$2,$3,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。
实例:
4<
4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,不用说了,得到22,则4<
此时按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。
4<<34 :相当于 4<<2
OK, 大功告成。
综上所述:
在不大于自身数值类型最大位数的移位时,
m<
m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件 的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。
接 下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。
比如:a*2,
1.jvm先为变量a分配空间;2.再进行a*2的操作;3.再把结果返回给相应的变量。
而 a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数
进行操作时可用。
在hashMap扩容中使用过:左移
int capacity = 1;while (capacity
capacity<<= 1;
ArrayList扩容中使用过:右移
/*** Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
*@paramminCapacity the desired minimum capacity*/
private void grow(intminCapacity) {//overflow-conscious code
int oldCapacity =elementData.length;int newCapacity = oldCapacity + (oldCapacity>> 1);if (newCapacity - minCapacity < 0)
newCapacity=minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity=hugeCapacity(minCapacity);//minCapacity is usually close to size, so this is a win:
elementData =Arrays.copyOf(elementData, newCapacity);
}
再 进行些许补充,谈到位操作,当然还要说到四个操作符:
~(按位非),|(按位或),&(按位与),^(按位异或),
这些都是大学 计算机基础用法,对整数的二进制形式进行操作,然后再
转换为整数,具体操作如下。
1.~(按位非):【解义】对该整数的二进制形 式逐位取反。
~4:(一元操作符)
4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得
到:11111111 11111111 11111111 11111011,即为-5.
2.| (按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1
等。
4|-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.
3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与 运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。
4&-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.
实际应用:可以把字节转换为整 数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、
其实0xFF和0377都表示的是整数255、
4.^(按 位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
4^-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.
实际应用:按位异或可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。 20^20==0
转自:http://aokunsang.javaeye.com/blog/615658
关于二进制一些说明:
关于负数的二进制表示方法
今天知道了对于负数的二进制方法的表示方法:例如 -5
第一步:首先要把5变成101的二进制形式
第二步:再者就是按位取反,(形 成前面全是1)010
第三步:在最后加1 形成:11111111 11111111 11111111 11111011
反过来如果把 最高位是1的二进制变成负的整形时
第一步:位取反,变成00000000 00000000 00000000 00000100
第二 步:在最低位加上1,形成101
第三步:形成整形5 ,在加上负号;
在java中怎么用代码实现二进制于十进制的转化
public int binaryInToInt(String str)
{
int j=0,i=0;
char c;
for(i=0;i
{
if(str.charAt(str.length()-i)=='1')
{
j=j+exp(2*ln(str.length()-i));
}
}
return j;
}
转自:
http://blog.csdn.net/zdp5528/archive/2008/04/10/2278719.aspx
(1)正负表示方法
用字节的最高位表示:"1"表示"正","0"表示"负"
(2)计算机中数字是以哪个码储存的?
补码
(3) 负数 的二进制补码转换成十进制的方法
1、把补码“取反”(把二进制数的各位“1”换“0”,“0”换“1”。比如“101010”取反后为“010101”)
2、把取反后的二进制数“加1”
3、最后用常规的方法把“加1”后的二进制数转换为十进制数
将负数转换为二进制
详见:https://www.cnblogs.com/lukelook/p/11274795.html
1.~(按位非):【解义】对该整数的二进制形 式逐位取反。~4:(一元操作符)4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得到:11111111 11111111 11111111 11111011,即为-5.2.| (按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1等。4|-5:4的二进制形式为:00000000 00000000 00000000 00000100,-5的二进制形式为:11111111 11111111 11111111 11111011,逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与 运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。4&-5:4的二进制形式为:00000000 00000000 00000000 00000100,-5的二进制形式为:11111111 11111111 11111111 11111011,逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.
实际应用:可以把字节转换为整 数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、
其实0xFF和0377都表示的是整数255、
4.^(按 位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
4^-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.
实际应用:按位异或可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。 20^20==0
转自:http://aokunsang.javaeye.com/blog/615658
关于二进制一些说明:
关于负数的二进制表示方法
今天知道了对于负数的二进制方法的表示方法:例如 -5第一步:首先要把5变成101的二进制形式第二步:再者就是按位取反,(形 成前面全是1)010第三步:在最后加1 形成:11111111 11111111 11111111 11111011反过来如果把 最高位是1的二进制变成负的整形时第一步:位取反,变成00000000 00000000 00000000 00000100第二 步:在最低位加上1,形成101第三步:形成整形5 ,在加上负号;在java中怎么用代码实现二进制于十进制的转化public int binaryInToInt(String str){int j=0,i=0;char c;for(i=0;i
(1)正负表示方法
用字节的最高位表示:"1"表示"正","0"表示"负"
(2)计算机中数字是以哪个码储存的?
补码
(3) 负数 的二进制补码转换成十进制的方法
1、把补码“取反”(把二进制数的各位“1”换“0”,“0”换“1”。比如“101010”取反后为“010101”)
2、把取反后的二进制数“加1”
3、最后用常规的方法把“加1”后的二进制数转换为十进制数
java位操作_关于java按位操作运算相关推荐
- 易语言 java支持_开源Java客户端可以连接易语言服务器
我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后, 都要先跟当前的客户端通信完之后才能再处理下一个连接请求. 这在并发比较多的情况下会严重影响程序的性能, 为此,我们可 ...
- java 异常_学习Java,你需要知道这些Java异常
文章目录 异常处理的概念 异常的基本概念 Java异常处理机制的优点 错误的分类 异常的分类 预定义的一些常见异常 异常的处理 抛出异常 捕获异常的语法 生成异常对象 声明自己的异常类 异常处理的概念 ...
- 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...
最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...
- java 模板方法_设计模式(java实现)_模板方法模式(Template method)
设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...
- java安装_使用Java 9模块化来发布零依赖本机应用程序
java安装 为什么我不能仅构建一个.EXE? 首次引入Java时,主流编程语言大多要么编译成独立的可执行文件(例如C / C ++,COBOL),要么在解释器中运行(例如Perl,Tcl). 对于许 ...
- java转账_使用Java模拟银行账户存、取款、转账功能
半枯 package bank;import java.util.Scanner;/** * 1.建立一个银行账户类(Acount),具有建立新帐号.查询余额.存款.取款.转账 * 即从本账户把钱转给 ...
- java预期_预期. java的
我有这段java代码.我是java中的菜鸟.. 错误: expected cfg = new Config; 码: import java.sql.Connection; import java.sq ...
- python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能
摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...
- java书籍_学习Java最好的10本书,从入门到精通
在当代,学习Java等编程课程的主要方式是视频资源,如果你想学,在网上五分钟之内就可以找到一堆学习视频,瞬间将你的硬盘填满.但是这些课程质量良莠不齐,对于小白来说很难辨别好坏. 但是书籍不同,书籍都是 ...
- java 方块_哈工大java实验 移动小方块
/*java第二次实验 * 移动小方块 */ import javax.swing.*; import java.awt.event.*; import java.awt.geom.*; import ...
最新文章
- 【OpenCV】cv::VideoCapture 多线程测试
- 关于UUID的二三事
- VCSA 6.5 HA 配置之五:故障转移测试
- PTA数据结构与算法题目集(中文)7-24
- GNSS NMEA ddmm.mmmmm格式转换
- vue 中eslint 格式报错
- HBase-site.xml 常见重要配置参数(转载)
- 安卓手机浏览器排行_5g时代已来临!五月安卓手机性价比排行:两千元以上5G手机屠榜...
- 手机耗电统计app_华为手机有哪些功能关掉比较好?
- linux 添加接口永久,在Linux中,配置虚拟网络接口
- python智慧树章节答案_Python程序设计_知到智慧树_章节答案
- tensorflow项目构建流程
- 微软Exchange Server 2010 SP1下载
- ArcScene:构建三维地图
- 实验一 白盒测试用例设计
- Android 使用 Android Studio 把图片转为WebP格式来减小图片的大小
- maven运行Error:(3, 14) java: 程序包不存在
- iOS-根据银行卡号判断银行名称
- Codeforces 26B. Regular Bracket Sequence
- 电商实训四:网络营销方案设计及实施
热门文章
- php设置cookie值,PHP如何设置和取得Cookie值
- poj 2255 Tree Recovery 解题报告
- 服务器u8系统数据库不存在,用友u8服务器端数据库不装
- pythom打包文件太大_从SQL注入到整站打包与本地搭建
- python程序中想使用正则表达式_python中正则表达式的使用方法
- java上传组件_java上传组件FileUpload
- dropzonejs vue 使用_如何在Dropzone上手动触发上传文件事件
- [UE4]性能优化指南(美术向)
- RegOpenKeyEx 返回值 2
- 使用正则把数字前面的符号替换_正则表达式(一) 基本表达式