C#中如何将short转换为bool[]数组?求多种实现方案及优缺点
在C#中将short转换为bool[]的多种实现方案及优缺点分析
在C#里把short转成bool数组其实有不少实用的实现方式,我整理了几种常用的,每种都有各自的优劣势,你可以根据场景需求来选:
方案一:逐位位移+按位与(最直观的基础写法)
这种方法逻辑非常直白,核心就是循环遍历short的每一位,通过位移把目标位移到最低位,再用按位与1来判断该位是否为1。如果需要和你示例里的顺序(高位到低位对应数组前到后)一致,最后要反转数组:
bool[] ToArrayOfBool(short source) { bool[] result = new bool[16]; for (int i = 0; i < 16; i++) { // 把source右移i位,提取最低位判断是否为1 result[i] = (source >> i & 1) == 1; } // 反转数组,让高位对应数组的前几个元素 Array.Reverse(result); return result; }
优缺点
- 优点:逻辑简单易懂,新手一眼就能明白,调试起来也方便,完全手动控制每一步流程。
- 缺点:需要额外执行一次数组反转操作,循环16次的性能在极端高频调用场景下不算最优;如果只需要转换低8位(比如你示例里的132),还要手动调整循环次数和数组长度。
方案二:利用BitConverter内置类(更简洁的写法)
.NET自带的BitConverter可以直接把short转成字节数组,我们只需要遍历每个字节的每一位即可,同样需要反转数组来匹配目标顺序:
bool[] ToArrayOfBool(short source) { bool[] result = new bool[16]; byte[] bytes = BitConverter.GetBytes(source); int index = 0; // 逐个字节解析每一位 foreach (byte b in bytes) { for (int i = 0; i < 8; i++) { result[index++] = (b >> i & 1) == 1; } } Array.Reverse(result); return result; }
优缺点
- 优点:借助内置类减少了手动处理字节结构的代码,看起来更简洁,不用自己操心short的字节拆分逻辑。
- 缺点:依赖
BitConverter的字节序(虽然主流平台上short的转换逻辑一致,但跨平台场景下需要额外注意);同样需要反转数组,性能和方案一差不多。
方案三:预计算位掩码(性能优化版)
如果追求一点性能提升,可以提前预定义好每一位的掩码数组,避免每次循环都计算位移值:
// 静态预定义16位的掩码,程序启动时只计算一次 private static readonly int[] _bitMasks = Enumerable.Range(0, 16).Select(i => 1 << i).ToArray(); bool[] ToArrayOfBool(short source) { bool[] result = new bool[16]; for (int i = 0; i < 16; i++) { // 用预定义掩码和source做按位与,判断该位是否为1 result[i] = (source & _bitMasks[i]) != 0; } Array.Reverse(result); return result; }
优缺点
- 优点:预计算掩码避免了循环内的位移计算,性能比方案一略高一点,适合高频调用的场景。
- 缺点:需要维护一个静态掩码数组,代码复杂度稍高;还是需要反转数组来匹配目标顺序。
方案四:直接按目标顺序赋值(省去反转步骤)
如果不想做数组反转,可以直接从最高位开始判断,把结果直接放到数组对应的索引位置,一步到位得到目标顺序:
bool[] ToArrayOfBool(short source) { bool[] result = new bool[16]; for (int i = 0; i < 16; i++) { // 计算当前要判断的位位置(从最高位15开始,逐步降到0) int bitPosition = 15 - i; // 位移后判断该位是否为1,直接赋值到数组的第i位 result[i] = (source >> bitPosition & 1) == 1; } return result; }
优缺点
- 优点:省去了数组反转的开销,性能是这几个方案里最优的;直接生成目标顺序的数组,不需要额外处理。
- 缺点:需要理解位位置和数组索引的对应关系,逻辑上比基础写法稍绕一点,但习惯后也很容易上手。
针对你示例的补充说明
你示例里的132二进制是10000100(8位),对应的16位short是0000000010000100,如果只需要得到8个元素的数组,可以把上面的代码调整为循环8次,数组长度设为8:
bool[] ToArrayOfBool(short source) { bool[] result = new bool[8]; for (int i = 0; i < 8; i++) { int bitPosition = 7 - i; result[i] = (source >> bitPosition & 1) == 1; } return result; }
调用这个方法传入132,就会得到你期望的{false, false, true, false, false, false, false, true}。
内容的提问来源于stack exchange,提问作者TheColonel26




