long、int转为byte[]

本文探讨如何将long和int类型的数据快速转换为byte数组,特别是初始化byte数组长度为0的方法。通过一位一位赋值或转换为long的方式,实现高效赋值。并介绍了将long拆分为8个字节以及处理剩余不足8位的部分,同时提供通用的setLong、writeInt和writeByte函数,便于后续不同数值的写入操作。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

很多数据类型的基本数据结构都是byte[],如何快速初始化byte[]的length位为0。

1、 一位一位的赋值

byte[] data = new byte[10000];
for (int i = 0; i < length; i++){
	data[i] = (byte)0;
}

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);
}

基于上面的基础,我们就可以把赋值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);
    }
}

公用函数在此:

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);
}

总结:

第一种方法最直观,而且时间复杂度与后两种是一样的,但是没有抽象出公共的方法,后面的方法虽然啰嗦,时间复杂度也没有降低,但是抽象出了setLong、writeInt、writeByte等把相应数据结构写入byte[]的办法,后续在赋值的时候,不管是0,还是其他数值,都可以直接调用

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值