A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

前几天学了位运算,int类型的表示无压力,byte类型的一开始感觉各种bug,后来多试了几次感觉有些心得,来分享一下(其实这东西感觉意义真心不大,但是咱程序员不就是爱折腾嘛)
大家都知道byte类型表示数的范围是-128~127,或者说0b00000000~0b11111111,那能不能直接用二进制数给byte类型的变量赋值呢?
class Demo{
    public static void main(String[] args){
        byte b = 0b11111111;//这样写会出错,因为这样写会先把0b11111111转换成int型的数,即255,放不进byte类型中.
        byte a = (byte)(0b11111111);//将0b强行转换一下就可以了.byte类型强行转换相当于取后后8位,前面舍去.
    }
}
接下来是位运算
如果a进行位运算右移2位,分别用>>>和>>
        byte a1 = (byte)(a>>>2);//得出来是-1
        byte a2 = (byte)(a>>2);//得出来是-1
这里为什么得出来都是-1,>>得-1不奇怪,但是为什么>>也是-1,不应该是前面补0的吗?也就是得出来 0b00111111,即63.
我当时想了好久,终于搞明白.当byte类型的a进行位运算的时候会自动类型提升为int类型,那么a会从byte类型的-1变成int类型的-1,即0b11111111 11111111 11111111 11111111(方便看清加了空格)然后移位,该补0的补0,该补1的补1.所以移位以后分别是
a>>>2; 0b00111111 11111111 11111111 11111111,取后8位,即-1
a>>2;   0b11111111 11111111 11111111 11111111,取后8位,也是-1

为了验证一下移位真的是这样的,那就移30位试试
a>>>30; 0b00000000 00000000 00000000 00000011,取后8位,即3
a>>30;    0b11111111 11111111 11111111 11111111,取后8位放进byte类型中,是-1
class Demo
{
        public static void main(String[] args){
                byte a = (byte)0b11111111;
                byte a1 = (byte) (a >>> 30);
                byte a2 = (byte) (a >> 30);
                System.out.println("a1="+a1+" a2="+a2);
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马