栏目:Java8基础 作者:admin 日期:2015-01-02 评论:0 点击: 2,157 次
本教程给大家说一下makePositive的实现细节,这个函数的作用是将负数的byte字节数组转换为正值。具体实现过程见下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public class Test { private final static long LONG_MASK = 0xffffffffL; public static void main(String[] args) { byte [] a= new byte[5]; a[0]=-2; a[1]=-128; a[2]=-1; a[3]=-1; a[4]=-128; makePositive(a); } public static int[] makePositive(byte a[]) { int keep, k; int byteLength = a.length; for (keep=0; keep < byteLength & & a[keep]==-1; keep++) {} for (k=keep; k < byteLength & & a[k]==0; k++) {} int extraByte = (k==byteLength) ? 1 : 0; int intLength = ((byteLength - keep + extraByte) + 3)/4; int result[] = new int[intLength]; int b = byteLength - 1; for (int i = intLength-1; i >= 0; i--) { result[i] = a[b--] & 0xff; //按位与运算符"&"是双目运算符,只有对应的两个二进位均为1时,结果位才为1,否则为0。 //按位与运算通常用来对某些位清0或保留某些位。 int numBytesToTransfer = Math.min(3, b-keep+1); if (numBytesToTransfer < 0) { numBytesToTransfer = 0; } for (int j=8; j <= 8*numBytesToTransfer; j += 8) { result[i] |= ((a[b--] & 0xff) << j); //所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。 //按位或然后赋值给result } // Mask indicates which bits must be complemented int mask = -1 >>> (8*(3-numBytesToTransfer)); //所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。 //对于正数来说和带符号右移相同,对于负数来说不同 result[i] = ~result[i] & mask;//取反操作符用波浪线 } // Add one to one's complement to generate two's complement for (int i=result.length-1; i>=0; i--) { result[i] = (int)((result[i] & LONG_MASK) + 1); if (result[i] != 0) { break; } } return result; } } |
------====== 本站公告 ======------
金丝燕网,一个严谨的网站!