int dataLength = (data.length - modulus);
        int a1;
         int a2;
         int a3;
        for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) {
            a1 = data[i] & 0xff;
            a2 = data[i + 1] & 0xff;
            a3 = data[i + 2] & 0xff;
            bytes[j] = encodingTable[(a1 >>> 2) & 0x3f];
            bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f];
            bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f];
            bytes[j + 3] = encodingTable[a3 & 0x3f];
        }
谁帮我解释下上面这短代码
主要是        a1 = data[i] & 0xff;
            a2 = data[i + 1] & 0xff;
            a3 = data[i + 2] & 0xff;
不是太明白  麻烦各位了 

解决方案 »

  1.   

    转为该区间内对应数 [0,0xff]
    从二进制意义上讲 就是截断取末字节
      

  2.   

    a1 = data[i] & 0xff
    这样是因为data[i]估计是byte类型的,范围是 -128 ~ 127,通过 &0xFF 将小于0 的数字变成正,范围修改了0 ~255
      

  3.   

    感觉 这个好像没 什么用 , 你如果要   范围修改你原来是 byte , 你把它 改int ,或者double 不就行了 
      

  4.   

          tong gan
      

  5.   

    会不会是这样。想用一个int,或其他类型的每一位都表示一种状态,&是用来改变这个类型的每一位的状态。
      

  6.   

    主要是        a1 = data[i] & 0xff; 
                a2 = data[i + 1] & 0xff; 
                a3 = data[i + 2] & 0xff; int是32位,和0XFF相与后前两个字节均变为0,后两个字节不变。
      

  7.   

    你的data数组是什么类型的,LZ
      

  8.   

    截断取末字节,int是32位,和0XFF相与后前两个字节均变为0,后两个字节不变。
      

  9.   

    谁帮我解释下上面这短代码 
    主要是        a1 = data[i] & 0xff; 
                a2 = data[i + 1] & 0xff; 
                a3 = data[i + 2] & 0xff; 
    不是太明白  麻烦各位了 
    答:  
     int a1=data[i] & 0xff;  等价于:   int a1=( data[i] + 256 )% 256;如:当data[i]是-2时;
    则:  int a1=data[i];          //则  a1值是-2
          int a1=data[i] & 0xff;   //则  a1值是254
         int a1=( data[i] + 256 )% 256; //则  a1值是254
      

  10.   

    a1 = data[i] & 0xff; 假如data数组是byte[],并且他等于15 那么就可以看成这样15变成2进制是                  00001111
    而0xff(16进制)变成12进制是  11111111&运算符是个位运算符  意思是 “与”。以上结果是 00001111| 取“或” ^ 取反