Java 无符号右移与右移运算符的使用介绍

网友投稿 659 2022-12-03


Java 无符号右移与右移运算符的使用介绍

java 无符号右移介绍

最近学习Java,看到>>>运算符不太了解,也百度查了查,解释得不是很清晰。那么下面讲解我对>>>运算符的认识: >>>运算符:无符号右移运算符 在学习>>>无符号右移运算符前,我们先了解右移运算符>>

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符

描述

例子

如果相对应位都是1,则结果为1,否则为0

(A&B),得到12,即0000 1100

|

如果相对应位都是0,则结果为0,否则为1

(A | B)得到61,即 0011 1101

^

如果相对应位值相同,则结果为0,否则为1

(A ^ B)得到49,即 0011 0001

按位取反运算符翻转操作数的每一位,即0变成1,1变成0。

(〜A)得到-61,即1100 0011

<<

按位左移运算符。左操作数按位左移右操作数指定的位数。

A << 2得到240,即 1111 0000

>>

按位右移运算符。左操作数按位右移右操作数指定的位数。

A >> 2得到15即 1111

>>>

按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

A>>>2得到15即0000 1111

右移运算符

>>右移运算符:正数高位补0,负数高位补1

看一个例子:

public static void main(String[] args) {

/**

*bFcceEF 10的二进制:1010

* 因为是正数,所以计算机高位的0不会输出

* 负数会输出32位bit

*/

System.out.println(Integer.toBinaryString(10 >> 2));

System.out.println(Integer.toBinaryString(-10));

System.out.println(Integer.toBinaryString(-10 >> 2));

}

输出:

计算机计算数据以补码的方式进行计算

正数原码、反码、补码不变

负数(-10):以8bit(位)表示

原码----> 1000 1010

反码----> 1111 0101(符号位不变,其他位取反)

补码----&bFcceEFgt; 1111 0110(反码基础上 + 1)

所以会 -10 会输出:1111…0110

-10 >> 2 :1111…1101(高位补1)

10 >> 2:0000…0010

无符号右移运算符

>>> 无符号右移运算符与 >> 右移运算符的正数相同,只不过关键在于负数的不同,>>>运算符右移:**负数高位补 0 ,其它位不变**

看一个例子:

public static void main(String[] args) {

System.out.println(Integer.toBinaryString(10 >>> 2));

System.out.println(Integer.toBinaryString(-10));

System.out.println(Integer.toBinaryString(-10 >>> 2));

}

输出:(注意和以上例子比较)

解释

总结:

>>> 和 >> 的区别在于:

>>> 负数高位补 0;

>> 负数高位补1;

左移运算符   <<

左移的规则只记住一点:该数对应的二进制码补码整体左移,丢弃最高位,0补最低位

如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位;

当左移的运算数是int 类型时,每移动1位它的第31位(0~31)就要被移出并且丢弃;

当左移的运算数是long 类型时,每移动1位它的第63(0~63)位就要被移出并且丢弃。

当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

正数和负数的左移操作分两种情况:

(1)左移n位(1<=n<=31)之后操作数没有溢出

这种情况等价于===原操作*2^n,例如60的二进制补码是 111100=2^5+2^4+2^3+2^2=60

60左移25位之后的二进制补码为:01111000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^25=2^30+2^29+2^28+2^27

而int类型占四个字节,一共三十二位,第一位是符号位,int类型的数值范围是(-2^31~2^31-1)所以60左移25位操作数没有溢出,最高位还是0;

(2)左移n位(1<=n<=31)之后操作数溢出

但如果再向左移动一位的话,即60左移26位之后的二进制补码为:

11110000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^26=2^31+2^30+2^29+2^28

此时二进制最高位是1,操作数溢出,变成负数。

60移位前二进制(补码表示):

111100 60

-60移位前二进制(补码表示):

11111111111111111111111111000100 -60

左移的规则只记住一点:丢弃最高位,0补最低位

60左移1位的二进制(补码表示):

1111000 120

60左移25位的二进制(补码表示):

1111000000000000000000000000000 2013265920

60左移26位的二进制(补码表示):

11110000000000000000000000000000 -268435456

60左移30位的二进制(补码表示):

0 0

-60左移1位的二进制(补码表示):

11111111111111111111111110001000 -120

-60左移25位的二进制(补码表示):

10001000000000000000000000000000 -2013265920

-60左移26位的二进制(补码表示):

10000000000000000000000000000 268435456

-60左移32位的二进制(补码表示):

11111111111111111111111111000100 -60


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java基于接口实现模拟动物声音代码实例
下一篇:Java工程mybatis实现多表查询过程详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~