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;
不是太明白 麻烦各位了
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;
不是太明白 麻烦各位了
从二进制意义上讲 就是截断取末字节
这样是因为data[i]估计是byte类型的,范围是 -128 ~ 127,通过 &0xFF 将小于0 的数字变成正,范围修改了0 ~255
a2 = data[i + 1] & 0xff;
a3 = data[i + 2] & 0xff; int是32位,和0XFF相与后前两个字节均变为0,后两个字节不变。
主要是 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
而0xff(16进制)变成12进制是 11111111&运算符是个位运算符 意思是 “与”。以上结果是 00001111| 取“或” ^ 取反