欢迎光临
我们一直在努力

java算术右移操作符,java中无符号右移怎么运算

特别注意

特别注意:计算机运算是采用补码计算的。最后输出结果是运算结果后补码的原码。
本文所有的操作都是针对存储在计算机中中二进制的操作,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

下表是原码补码反码相互转换规则。

算术左移(<<):有符号的移位操作;该操作时将运算数的二进制码整体左移指定位数(<<符号左侧为运算数,右侧为移动位数),正数左移之后右侧的空位用0补充。如果是负数,移几位左边少几位,右边用0补齐。

算术右移(>>):有符号的移位操作;该操作时将运算数的二进制码整体右移指定位数,移几位右边去掉几位。(>>符号左侧为运算数,右侧为移动位数),右移之后左侧的空位正数用0补充(可省略),负数用1补充。

逻辑右移(>>>,无符号移位):无符号的移位操作;该操作时将运算数的二进制码整体右移指定位数,移几位右边去掉几位。(>>>符号左侧为运算数,右侧为移动位数),右移之后左侧的空位用0补充。

简单举例

*****************算术左移(<<)****************移位前: 4<<2 二进制为:0000 0100移位后:结果为16 二进制为:0000 0100 00 (移了2位)结果为16 ,也相当于4*2*2=16移位前:-4<<2 二进制为:1111 1100(-4的补码)移位后:结果为-16 二进制为:11111001010111100111100000000000特别注意:-4的原码为 1000 0100 -4的反码为 1111 1011 -4的补码为 1111 1100 左移2位得到 11 1100 00(补码) 移位后的反码 1110 1111 移位后的原码 1001 0000 移位后的原码 转换为2进制为 -16**************************************************************算术右移(>>)****************移位前: 4>>3 二进制为:0000 0100 相当于4/2/2/2=0移位后:结果为0 二进制为: 0000 0000 (右移了3位,去掉右边3位,正数左边补0)结果为0移位前:-4>>3 二进制为:1111 1100(-4的补码)移位后:结果为-1 二进制为:11111001010111100111100000000000特别注意:-4的原码为 1000 0100 -4的反码为 1111 1011 -4的补码为 1111 1100 右移3位得到 1111 1111(补码)(右移3,去掉右边3位,负数左边补1) 移位后的反码 1111 1110 移位后的原码 1000 0001 移位后的原码 转换为2进制为 -1********************************************* 难度提升的例子分析,以全部移动11位为例 *****************算术左移(<<)****************移位前:lnum1= 54321 二进制为:1101010000110001移位后:lnum1= 111249408 二进制为:110101000011000100000000000 (移了11位)移位前:lnum2= -54321 二进制为:11111111111111110010101111001111 (-54321的补码)移位后:lnum2= -111249408 二进制为:11111001010111100111100000000000特别注意:-54321的原码为 10000000 00000000 11010100 00110001 -54321的反码为 11111111 11111111 00101011 11001110 -54321的补码为 11111111 11111111 00101011 11001111 左移11位得到 11111001 01011110 01111000 00000000(补码) 移位后的反码 11111001 01011110 01110111 11111111 移位后的原码 10000110 10100001 10001000 00000000 移位后的原码 转换为2进制为 -111249408**************************************************************算术右移(>>)****************移位前:num= 54321 二进制为:1101010000110001移位后:num= 26 二进制为:11010 (右移11位,去掉右边11位)移位前:num1= -54321 二进制为:11111111111111110010101111001111(-54321的补码)移位后:num1= -27 二进制为:11111111111111111111111111100101 -54321的原码为 10000000 00000000 11010100 00110001 -54321的反码为 11111111 11111111 00101011 11001110 -54321的补码为 11111111 11111111 00101011 11001111 右移11位得到 11111111 11111111 11111111 11100101(补码) 移位后的反码 11111111 11111111 11111111 11100100 移位后的原码 10000000 00000000 00000000 00011011 移位后的原码 转换为2进制为 -27**************************************************************逻辑右移(>>>)*****************移位前:v1= 54321 二进制为:1101010000110001移位后:v1= 26 二进制为:11010移位前:v2= -54321 二进制为:11111111111111110010101111001111移位后:v2= 2097125 二进制为:111111111111111100101************************************************ 源代码 public class ShiftTest { public static void main (String args[]){ ShiftTest st=new ShiftTest(); st.ShiftTest(); } public void ShiftTest(){ System.out.println(“*****************算术左移(<<)****************”); int lnum1=54321; System.out.println(“移位前:lnum1= “+lnum1+” 二进制为:”+Integer.toBinaryString(lnum1)); lnum1=lnum1<<11; System.out.println(“移位后:lnum1= “+lnum1+” 二进制为: “+Integer.toBinaryString(lnum1)); int lnum2=-54321; System.out.println(“移位前:lnum2= “+lnum2+” 二进制为:”+Integer.toBinaryString(lnum2)); lnum2=lnum2<<11; System.out.println(“移位后:lnum2= “+lnum2+” 二进制为: “+Integer.toBinaryString(lnum2)); System.out.println(“*********************************************”); System.out.println(“\n”); System.out.println(“*****************算术右移(>>)****************”); int num=54321; System.out.println(“移位前:num= “+num+” 二进制为:”+Integer.toBinaryString(num)); num=num>>11; System.out.println(“移位后:num= “+num+” 二进制为: “+Integer.toBinaryString(num)); int num1=-54321; System.out.println(“移位前:num1= “+num1+” 二进制为:”+Integer.toBinaryString(num1)); num1=num1>>11; System.out.println(“移位后:num1= “+num1+” 二进制为: “+Integer.toBinaryString(num1)); System.out.println(“*********************************************”); System.out.println(“\n”); System.out.println(“*****************逻辑右移(>>>)*****************”); int v1=54321; System.out.println(“移位前:v1= “+v1+” 二进制为:”+Integer.toBinaryString(v1)); v1=v1 >>> 11; System.out.println(“移位后:v1= “+v1+” 二进制为:”+Integer.toBinaryString(v1)); int v2=-54321; System.out.println(“移位前:v2= “+v2+” 二进制为:”+Integer.toBinaryString(v2)); v2=v2 >>> 11; System.out.println(“移位后:v2= “+v2+” 二进制为:”+Integer.toBinaryString(v2)); System.out.println(“***********************************************便宜香港vps*”); }} 45648168

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。