Java的无符号类型移位

Java的原始类型里没有无符号类型,如果需要某个宽度的无符号类型,可以用>>>,这个是java的无符号右移操作符,或者使用下一个宽度的带符号类型来模拟,例如,需无符号的short,就用int来模拟:

int toUnsigned(short s) { 
           return s & 0xFFFF; 

具体问题:

                    a = (argb[i] & 0xff000000) >> 24;
                    r = (argb[i] & 0xff0000) >> 16;
                    g = (argb[i] & 0xff00) >> 8;
                    b = (argb[i] & 0xff) >> 0;

在做颜色转换的代码中,就碰到了这个问题,前面的代码,因为最高位如果是1,那么经过argb[i] & 0xff000000计算,假如argb[i] = 0xf0000000, 那么0xf0000000经过移位运算就是0xfffffff0了,十进制值为-16, 因为右移的规则只记住一点:符号位不变,左边补上符号位。

换种说法就是:
带符号右移运算符用“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1。

所以本来应该是a = 0xf0, 十进制值为240, 最后的结果因为把这个值算错了。

解决这个问题的办法有两种:
1.使用下一个宽度的带符号类型来模拟
2.使用无符号右移运算符>>>

所以正确的写法是:

                    A = (argb[rgb_idx] & 0xff000000) >>> 24;
                    R = (argb[rgb_idx] & 0xff0000) >>> 16;
                    G = (argb[rgb_idx] & 0xff00) >>> 8;
                    B = (argb[rgb_idx] & 0xff) >>> 0;

java窄的整型转换成较宽的整型时是有符号扩展,但是如果它是char,那么不管它将要被提升成什么类型,都执行零扩展。java从宽的整型转窄的整型时,是直接截取最低位的字节。

参考:

https://www.cnblogs.com/jpit/p/9068429.html
https://blog.csdn.net/A_zhenzhen/article/details/78835327
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值