JAVA基础位运算符

tech2022-10-24  109

位移操作:

只针对 int类型的数据有效,java中,一个int的长度始终是32位,就是4个字节,它操作的都是该整数的二进制数)

也可以作用于以下类型,即 byte,short,char,long(当然,它们都是整数形式)。这四种类型是,JVM先把它们转换成int型再进行操作。 (1) << 左移 (2) >> 右移 (3) >>> 无符号右移 << 和 >>为数值位移,>>>为逻辑位移。 【注】:Java中不存在<<<。

m<<n的含义

把整数m表示的二进制数左移n位,高位移出n位都舍弃,低位补0. (此时将会出现正数变成负数的形式) 例如: 左移使整数变为负数: 10737418<<8 10737418二进制表示形式:00000000 10100011 11010111 00001010, 按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.

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.

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.

【注】:对于上述三种情况,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。 实例: 4<<-10 4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,得到22,则4<<-10,即相当于4<<22。 此时按照再按照m<<n原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。 综上所述: m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方. m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。 如果结果为小数,此时会出现两种情况: (1)如果m为正数,得到的商会无条件的舍弃小数位; (2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。

接下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。 比如:a2, 1.jvm先为变量a分配空间; 2.再进行a2的操作; 3.再把结果返回给相应的变量。 而 a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数进行操作时可用。

声明:本文转自http://uule.iteye.com/blog/2095860

最新回复(0)