这是Core java卷2第144页的一些代码,没看懂怎么回事,请高手指点
一下是这个代码
super.write(toBase64[(inbuf[0]&0xFC])>>2);char[] toBase64={'A','B','C','D','E'...........}

解决方案 »

  1.   

    补充一下,super是指的FilterOutputStream
      

  2.   


    0xfc:1111 1100
    inbuf[0]&0xfc,就是除了inbuf[0]的第2到第7位(就是0xFC中那些为1的位),其它位清0.
    >>2就是右移2位.(也相当于除4).
      

  3.   

    super.write(toBase64[(inbuf[0]&0xFF])>>2);结果和原来的一样.
      

  4.   

    谢谢,能不能给个详尽的语法解释 inbuf[0]&0xff
      

  5.   

    就是两个数做按位相与的位运算.结果就是把inbuf[0]的高位字节全部清为了0,只保留了最低的一个字节
    你intbuf[0]是什么类型?如果是byte类型,这句的意思就是把取绝对值的意思.你说一下intbuf是什么类型的数组.
      

  6.   

    你给一下inbuf[0]的例子,我给你写出代码是怎么运算的.
      

  7.   

    int[] inbuf=new int(3);
    inbuf[0]=100;
    super.write(toBase64[(inbuf[0]&0xFF])>>2);
      

  8.   

    计算机内都是用二进制进行运算的.所以100要转为二进制.int 的100要占4个字节,在内存中是这样的:
    0000 0000 0000 0000 0000 0000 0110 0100
    下面是inbuf[0]与0xff相与:
    与运算规则是 同为1才为1,其它都为0.  0000 0000 0000 0000 0000 0000 0110 0100
    & 0000 0000 0000 0000 0000 0000 1111 1111
    -------------------------------------------
      0000 0000 0000 0000 0000 0000 0110 0100
    下面是上面的结果>>2,就是右移二位,空出来的高位要补原数的符号位(就是最高那位)结果是:
    0000 0000 0000 0000 0000 0000 0001 1001这个数是1+8+16=25(实际就是100/4).
     
    把25做为toBase64的下标,toBase64[25]是'Z',字符'Z'write出去.可能你也注意到了,100&0xff结果就是100.那inbuf[0]&0xff有什么意义呢?
    这个主要是针对inbuf[0]为负数的情况.
    我看了原书,应该上Base64OutputStream继承自FilterOutputStream.其write方法的参数虽然是int,但实际上写的是int中的最低的那个字节.所以intBuff[0] 写出去的就是最低的那个字节.由于是以64进制的形式写出去的,一位64进制的数对应二进制是6位。也就是每6位二进制对应一位64进制。三个字节正好是24位二进制,可以转成4位64进制字符。程序中用一个长度为3的int数组表示这三个字节的数据。转为64进制时,|11111122|22223333|33444444|,标1的二进制位为第一个64进制的位,标2的为第二个64进制位,标3的6位二进制为第三个64进制位,标4的为第4个64进制位。11111122这个字节放在inbuf[0]中,22223333这个字节放在inbuf[1]中,33444444这个字节放在inbuf[2]中。所以写第一个64进制位字符时,要取出第一个字节(inbuf[0])的高6位,转为对应的64进制字符,写出去。写第二个64进制字符时,要把第一个字节(inbuf[0])的低2位与第二个字节(inbuf[1])的高4位合在一起转为一个64进制字符,写出去。写第三个64进制位字符时,要把第二个字节(inbuf[1])的低四位与第三个字节(inbuf[2])的高2位合在一起,转为64进制位字符,写出去。第四个64进制字符时,要把第三个字节的低6位转为64进制字符,写出去。把一个字节的某几位取出来就要用&运算,把两部分二进制合在一起要用|或运算。