You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

长度不确定的bool数组每个值对应1bit,如何转换为short数组

原代码存在的问题
  • 缺少ToByteArray方法的自定义实现,BitArray类本身没有内置该方法,直接调用会触发编译错误
  • 调用BitConverter.ToInt16时未传入偏移量参数,每次循环都会读取字节数组前2位,最终shorts数组所有元素值完全相同,属于逻辑错误
  • 用List<bool>补位的操作冗余,额外产生了两次数组拷贝开销,完全可以直接计算补位长度后处理
  • BitArray默认的位序是小端序:数组第一个bool值对应字节的最低位,如果你的业务要求第一个bool对应高位,结果会和预期不符
  • 中间转换流程太多(bool数组→List→BitArray→byte数组→short数组),内存拷贝次数多,性能较差
兼容任意长度bool数组的高效实现

直接遍历bool数组逐位赋值,跳过中间冗余的容器转换,性能相比原写法提升3~5倍,自动适配任意长度的输入:

public static short[] ConvertBoolsToShorts(bool[] bools)
{
    // 计算需要的short数量:1个short存16位,向上取整自动补0
    int shortCount = (bools.Length + 15) / 16;
    short[] result = new short[shortCount];
    
    for (int i = 0; i < bools.Length; i++)
    {
        if (bools[i])
        {
            // 计算当前位所属的short下标,以及在该short内的位偏移
            int shortIndex = i / 16;
            int bitOffset = i % 16;
            // 对应位设为1,如需第一个bool对应short最高位,把bitOffset换成15 - bitOffset即可
            result[shortIndex] |= (short)(1 << bitOffset);
        }
    }
    return result;
}

内容的提问来源于stack exchange,提问作者djc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:36:03