long、int转为byte[]
很多数据类型的基本数据结构都是byte[],如何快速初始化byte[]的length位为0。
1、 一位一位的赋值
byte[] data = new byte[10000]; for (int i = 0; i < length; i++){ data[i] = (byte)0; }
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
2、转换为long的方式赋值
现在要解决的问题是给length位byte赋值为0,我们可以拆分一个函数,就是把long写入byte[]中,代码如下,该函数每被调用一次,就解决了8个长度的赋值问题,这个函数不光可以解决初始化为0的需求,还可以解决任意把long赋值给byte[]的需求。
public void setLong(int index, long value) {
data[index] = (byte) (value);
data[index + 1] = (byte) (value >>> 8);
data[index + 2] = (byte) (value >>> 16);
data[index + 3] = (byte) (value >>> 24);
data[index + 4] = (byte) (value >>> 32);
data[index + 5] = (byte) (value >>> 40);
data[index + 6] = (byte) (value >>> 48);
data[index + 7] = (byte) (value >>> 56);
}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
基于上面的基础,我们就可以把赋值length位的需求改为赋值length / 8 位的需求,为了表达的更直观,我们可以用无符号右移3位代替除以8。因为刚刚右移了3位,所以最后3位表示的个数还没有写到数组中,length & 7的结果可以得到length的最后三位的数值,对该值进行单独处理,其中writeInt、writeByte是把int、byte写入到byte[]中。
// 无符号右移3位相当于除以8 int nLong = length >>> 3; for (int i = nLong; i > 0; i--) { setLong(i, 0); } // 7的二进制是0111,与7做与运算相当于只取最后三位 int nBytes = length & 7; if (nBytes == 4) { writeInt(0); } else if (nBytes < 4) { for (int i = nBytes; i > 0; i--) { writeByte((byte) 0); } } else { writeInt(0); for (int i = nBytes - 4; i > 0; i--) { writeByte((byte) 0); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
公用函数在此:
public void setByte(int index, int value) {
data[index] = (byte) value;
}
public void setInt(int index, int value) {
data[index] = (byte) (value);
data[index + 1] = (byte) (value >>> 8);
data[index + 2] = (byte) (value >>> 16);
data[index + 3] = (byte) (value >>> 24);
}
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
总结:
第一种方法最直观,而且时间复杂度与后两种是一样的,但是没有抽象出公共的方法,后面的方法虽然啰嗦,时间复杂度也没有降低,但是抽象出了setLong、writeInt、writeByte等把相应数据结构写入byte[]的办法,后续在赋值的时候,不管是0,还是其他数值,都可以直接调用
赞 (0)