Sogou2012校园招聘测评题目(Java版)
public class Test {
public static void encode(byte[] in, byte[] out, int password)
{
int len = in.length;
int seed = password ^ 0×3810860;
for (int i = 0 ; i < len; ++i) {
/**
*因为JVM中涉及byte、short、char类型的运算操作首先会把这些值转换成int类型,
* 然后对int类型的值进行运算,所以需要把运算结果强制转换成byte类型
*/
byte a = (byte)( ( in[i] ^ seed ) >>> 5 );//把异或后的值存放在a的低3位
byte b = (byte)( ( ( ((int)in[i]) << 20 ) ^ seed ) >>> (20-3) );//把异或后的值存放在b的高5位
a &= 0×7;//0×7:0000 0111;将a中未存储有效数的位清零
b &= 0xf8;//0xf8:1111 1000;将b中未存储有效数的位清零
out[i] = (byte)(a | b);
seed = ((seed ^ out[i]) * 7321 + out[i]);
}
}
public static void decode(byte[] in, byte[] out, int password)
{
int len = in.length;
int seed = password ^ 0×3810860;
for (int i = 0 ; i < len; ++i) {
// fill the code here
}
}
public static void main(String [] args) throws Exception
{
int password = 0x808d0625;
byte[] buf1 = {-36, -108, -73, 95, 56, 80, -103, -49, 59, -52, -30, 70, -93, 88, 110, -128, 88, -42, 1, 114, -117, -67, -84, 55, 24, -107, -97, -51, 60, -117, 113, 38, 110, -103, -70, 100, 54, -126, };
byte[] buf2 = new byte[buf1.length];
decode(buf1, buf2, password);
System.out.println(new String(buf2, “GBK”));
}
}
代码及解析:
典型的考察位运算的题目,不要指望copy,每次答案都不一样。
/*byte共8位,红色部分和蓝色部分与encode保持一致*/
byte a = (byte)(((in[i] & 0×7) << 5) ^ seed);//把值存放到a的高3位
byte b = (byte)(((((((int)in[i]) & 0xf8 ) << (20 – 3))) ^ seed) >>> 20); //把值存放到b的低5位
a &= 0xe0; //0xe0:1110 0000;将a中未存储有效数的位清零
b &= 0x1f; //0x1f:0001 1111;将b中未存储有效数的位清零
out[i] = (byte)(a | b);
/*与encode代码保持一致,in和out互换*/
seed = ((seed ^ in[i]) * 7321 + in[i]);
答案就不贴了,每次都不一样,以实际运行结果为准
来支持!!!
貌似杀花了,再来个板凳。。。
提前祝博主:元宵节快乐!!