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)

相关推荐