不懂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) { /** * 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(符号位不变,其他位取反)
补码----> 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位,实际上只移动了332=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
感谢你能够认真阅读完这篇文章,希望小编分享java 无符号右移与右移运算符是什么?内容对大家有帮助,同时也希望大家多多支持本站,关注本站行业资讯频道,遇到问题就找本站,详细的解决方法等着你来学习!