java short右移24位_对于Thinking In Java中byte,short无符号右移的理解

拜读Thinking In Java看到以下内容

若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。

//对于上面的话 可以看成移动的实际位数 是 给定的移动位数%数据类型的位数

eg.

*int x = 100;

*    x << 35;//结果是800

*a:1100100//二进制补码

*35:100011//二进制补码,int类型取5个低位00011即3(相当于35%32=3)

*结果:1100100000//800

但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。可用下面这个例子检测自己的实现方案:

//

//: URShift.java

// Test of unsigned right shift

public class URShift {

public static void main(String[] args) {

int i = -1;

i >>>= 10;

System.out.println(i);//4194303

long l = -1;

l >>>= 10;

System.out.println(l);//18014398509481983

//上面两个好理解

short s = -1;

s >>>= 10;

System.out.println(s);//-1

byte b = -1;

b >>>= 10;

System.out.println(b);//-1

//这两句不理解然后写了下面一段代码

}

} ///:~

for (int i = 1; i < 32; i++) {

byte s = -1;

s >>>= i;

System.out.println(i + " " + s);

//结果是:1 -1 2 -1 3 -1 4 -1 5 -1 6 -1 7 -1 8 -1 9 -1 10 -1 11 -1 12 -1 13 -1 14 -1 15 -1 16 -1 17 -1 18 -1 19 -1 20 -1 21 -1 22 -1 23 -1 24 -1 //25 127 26 63 27 31 28 15 29 7 30 3 31 1 //为了省版面好乱 就是直到>>>25 s的结果才不再是-1

// System.out.println(Integer.toBinaryString(s));

}

想了想觉得应该是>>>= 这个写法的事 于是又写了以下

byte s = -1;

int ss = s >>> i;

System.out.print(i + " " + ss + " ");

//结果是:1 2147483647 2 1073741823 3 536870911 4 268435455 5 134217727 6 67108863 7 33554431 8 16777215 9 8388607 10 4194303 11 2097151 12 1048575 13 524287 14 262143 15 131071 16 65535 17 32767 18 16383 19 8191 20 4095 21 2047 22 1023 23 511 24 255 25 127 26 63 27 31 28 15 29 7 30 3 31 1这就很明显了 s>>>=i; 此时s是byte类型>>>1到24的值(int)都超过byte的取值范围了.btw 如果是short类型 s>>>i在i=17时开始17 32767 18 16383 19 8191 20 4095 21 2047 22 1023 23 511 24 255 25 127 26 63 27 31 28 15 29 7 30 3 31 1

s=(short)(s>>>10);//就酱

怪不得网上没找到解答,原来这么简单新手在此记录下!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值