You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动