长度不确定的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
相关产品推荐
相关产品推荐

