怎么使用java移位符
创始人
2024-12-22 03:21:11
0次

概述

java移位符主要包括3种:

>>      左移运算符              <<      有符号右移运算符              <<<      无符号右移运算符

这里我们先附上代码运行实例,原理将在后面以解析下面代码的方式进行讲解:

public class BitOperatorTest { public static void main(String[] args){  System.out.println(1 << 4);  System.out.println(-1 << 3);  System.out.println(8 >> 3);  System.out.println(-8 >> 3);  System.out.println(-8 >>> 3); }}

运算符名称

结果如下:

16-81-1536870911

首先我们需要清楚在计算机系统中,数值一般用补码来表示,主要原因是因为使用补码可以使符号位和其他位统一处理,我们需要将上面的数值都转化为补码。

左移运算符

1 << 4

首先我们将1化为源码:0000 0000 0000 0000 0000 0000 0000 0001 (因为其是int类型,所以化为二进制有32位)

正数的补码和反码等于源码的本身。所以补码也为上述二进制代码。

左移运算符是将操作数的二进制码整理左移指定位数,左移后右面空出的位用0来补充。

左移4位 0000 0000 0000 0000 0000 0000 0000 0001 1*2^0=1

0000 0000 0000 0000 0000 0000 0000 0001 0000 (红色被移除截断,蓝色是新补的0) 1*2^4=16

-1 << 3

我们开始第二个输出语句,这是一个负数。负数的反码是他的源码符号位不变,其余按位取反。补码是他的反码加一。 所以我们可以得到-1的源码为1000 0000 0000 0000 0000 0000 0000 0001 -1*2^0=-1           反码为1111 1111 1111 1111 1111 1111 1111 1110           补码为1111 1111 1111 1111 1111 1111 1111 1111

对补码进行操作得111 1111 1111 1111 1111 1111 1111 1111 1000 (红色被移除截断,蓝色是新补的0)

将结果数转化为源码得1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=-8

总结

所以通过上面对左移运算符的简单使用不难发现,我们可以将其简便理解为移动几位,就是为操作数乘以2的几次方。

右移运算符

左移运算符不牵扯符号位的增补符号位,所以没有有无符号分类

有符号右移运算符

8 >> 3

根据上面流程,我这里直接就简化为    源码为:0000 0000 0000 0000 0000 0000 0000 1000 1*2^3=8    反码为:0000 0000 0000 0000 0000 0000 0000 1000    补码为:0000 0000 0000 0000 0000 0000 0000 1000

运算后结果:0000 0000 0000 0000 0000 0000 0000 0001 000 1*2^0=1(红色被移除截断,蓝色是新补的符号位,并且以原来的符号位填补)

-8 >> 3

根据上面流程,我这里直接就简化为    源码为:1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=8    反码为:1111 1111 1111 1111 1111 1111 1111 0111    补码为:1111 1111 1111 1111 1111 1111 1111 1000

运算后结果:1111 1111 1111 1111 1111 1111 1111 1111 000 (红色被移除截断,蓝色是新补的符号位,并且以原来的符号位填补) 转换为源码为:1000 0000 0000 0000 0000 0000 0000 0001 -1*2^0=-1

总结

同左移运算符一样,总结规律后可得出,右移运算符移动几位则是对操作数除以2的多少次方。

无符号右移运算符

-8 >>> 3

根据上面流程,我这里直接就简化为    源码为:1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=8    反码为:1111 1111 1111 1111 1111 1111 1111 0111    补码为:1111 1111 1111 1111 1111 1111 1111 1000

运算后结果:0001 1111 1111 1111 1111 1111 1111 1111 000 (红色被移除截断,注意黄色部分,在无符号右移运算位中统一补0)

此时数值将会非常大,所以得到程序中的结果。

补充

如果操作类型低于int类型,比如byte,char等,先将其转化为int类型在进行移位。

对于int类型的移位,如果移动位数超过32位,则让位数对32取余,然后进行运行,即a>>33 == a>>1 a>>32 ==a

同样如果对于long类型的移位,移动位数超过64,则也需要对移动位数进行处理。

代码补充

对于补充内容的代码不进行详解,代码及运算结果如下,基本流程与上面类似,

代码:

public class BitOperatorTest { public static void main(String[] args){  System.out.println((char)4 << 4);  System.out.println(4 << 4);  System.out.println(4 << 36);  System.out.println((long)1214 >> 66);  System.out.println((long)1214 >> 2); }}

运行结果:

646464303303

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...