黑马程序员技术交流社区

标题: byte类型的数用二进制赋值以及位运算的问题 [打印本页]

作者: 遗失的美好YXJ    时间: 2014-7-3 06:56
标题: byte类型的数用二进制赋值以及位运算的问题
前几天学了位运算,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);
        }
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2