java中逻辑右移">>>"算术右移">>"的区别?

1、算数右移 “>>”

考虑符号位,右移1位,若符号位为1,则左边补1;若符号位为0,则左边补0。

2、逻辑右移 “>>>”

不考虑符号位,左边统一补0

例子:

byte a = ~127;
System.out.println(a);
a = (byte)(a >>> 2);  //强制转成byte型,将对结果进行截断
System.out.println(a);

结果如下
-128
-32

分析:
首先, ~127的二进制数为10000000, (~127是取反运算)
但是JAVA在对不足32位的数(byte,char,short)进行移位运算时, 都会先转成int(32位),所以此时a为11111111111111111111111110000000
移位之后,(00)111111111111111111111111100000
但是你在此a = (byte)(a >>> 2); //强制转成byte型,将对结果进行截断
此时a为11100000, 就是32了

转自:http://blog.csdn.net/eclipse_c/article/details/50586972

这里写图片描述

展开阅读全文

有关算术右移逻辑右移的疑问

12-25

大家好,这是一道答案题,算术右移转逻辑右移的代码没看明白,就是getbits2函数那块,请高手解答rn我用的是vc++6.0,默认是算术右移rnrn[code=C/C++]/*rn编写一程序,检查一下你所用的计算机系统的C编译在执行右移时是按照逻辑位移的原则,还是按算术右移原则?如果是逻辑右移,请编一函数实现rn算术右移?如果是算术右移,请编写一函数以实现逻辑右移rn*/rn#include rnvoid main()rnrn short getbits1(unsigned value,int n);rn short getbits2(unsigned value,int n);rn short int a,n,m;rn a=~0;rn if((a>>5)!=a)rn rn printf("逻辑右移\n");rn m=0;rn rn elsern rn printf("算术右移\n");rn m=1;rn rn printf("请输入一个八进制数:");rn scanf("%o",&a);rn printf("请输入右移位数:");rn scanf("%d",&n);rn if(m==0)rn printf("算术右移结果:%o\n",getbits1(a,n));rn elsern printf("逻辑右移结果:%o\n",getbits2(a,n));rnrnrnshort getbits1(unsigned value,int n)rnrn unsigned short z;rn z=~0;rn z=z>>n;rn z=~z;rn z=z|(value>>n);rn return(z);rnrnrnshort getbits2(unsigned value,int n)/*就是这个函数*/rnrn unsigned short z;rn z=(~(1>>n))&(value>>n);//这一行rn/*rn1的二进制是0000000000000001,让n=3,就是右移三位,就变成了0000000000000000,1>>n就变成了0,然后~0又变成了1,z=1&(value>>3)rn如果value=1110000000000000,value>>3就是1111110000000000,1&(value>>3)=0000000000000001&1111110000000000,结果是0,不对啊,应该是rn0001110000000000rn*/rn return(z);rn[/code] 论坛

没有更多推荐了,返回首页