java的位运算.docx
上传人:sy****28 上传时间:2024-09-14 格式:DOCX 页数:6 大小:23KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

java的位运算.docx

java的位运算.docx

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

关于java按位操作运算<1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系:举例15和-15:15的原码:00000000000000000000000000001111补码:11111111111111111111111111110000+1=-15的原码:11111111111111111111111111110001负数的原码即为:正数的原码取反,再加1。<2>位移操作:(只针对int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可以作用于以下类型,即byte,short,char,long(当然,它们都是整数形式)。当为这四种类型是,JVM先把它们转换成int型再进行操作。<<左移>>右移>>>无符号右移<<和>>为数值位移,>>>为逻辑位移。【注】:Java中不存在<<<。$1>m<<n的含义:把整数m表示的二进制数左移n位,高位移出n位都舍弃,低位补0.(此时将会出现正数变成负数的形式)实例:3<<2剖析:3二进制形式:00000000000000000000000000000011,按照$1的原理,得到00000000000000000000000000001100,即为12.左移使整数变为负数:10737418<<810737418二进制表示形式:00000000101000111101011100001010,按照$1的原理,得到10100011110101110000101000000000,即为:-1546188288.$2>m>>n的含义:把整数m表示的二进制数右移n位,m为正数,高位全部补0;m为负数,高位全部补1.实例:3>>2剖析:3二进制形式:00000000000000000000000000000011,按照$2的原理,得到00000000000000000000000000000000,即为0.-3>>2剖析:-3二进制形式:11111111111111111111111111111101,按照$2的原理,得到11111111111111111111111111111111,即为-1.以上:每个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。备注:对于右移32位与右移0位是结果是一样的,我一直不能够理解。现在我只能理解为32比较特殊。相当于整体全移。与移0位相同。左移也是一样的。$3>m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补零。实例:3>>>2剖析:3二进制形式:00000000000000000000000000000011,按照$3的原理,得到00000000000000000000000000000000,即为0.-3>>>2剖析:-3二进制形式:11111111111111111111111111111101,按照$3的原理,得到00111111111111111111111111111111,即为1073741823.【注】:对于$1,$2,$3,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到n变成一个正数。实例:4<<-104的二进制形式:00000000000000000000000000000100,-10对32取模再加上32,不用说了,得到22,则4<<-10,即相当于4<<22。此时按照再按照$1原理,得到00000001000000000000000000000000,得到的即为:16777216。OK,大功告成。综上所述:m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方.m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。---------------------------------------------------------------------------------接下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。比如:a*2,1.jvm先为变量a分配空间;2.再进行a*2的操作;3.再把结果返回给相应的变量。而a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数进行操作时可用。再进行些许补充,谈到位操作,当然还要说到四个操作符:~(按位非),|(按位或),&(按位与),^(按位异或),这些都是大学计算机基础用法,对整数的二进制形式进行操作,然后再转换为整数,具体操作如下。1.~(按位非):【解义】