C# 如何将 short[] 转换为 bool[]?

8
short[] sBuf = new short[2];
sBuf[0] = 1;
sBuf[1] = 2;

bool[] bBuf = new bool[sBuf.Length * 16];
Buffer.BlockCopy(sBuf, 0, bBuf, 0, sBuf.Length * 2);

Desired result value  
sBuf[0] = 1
bBuf[0] = true, bBuf[1] = false, bBuf[2] = false, bBuf[3] = false...
sBuf[0] = 2
bBuf[16] = false, bBuf[17] = true, bBuf[18] = false, bBuf[19] = false...

但是无法正确转换。
我想将short []转换为bool [],但我不知道如何做。


11
bool元素应该在什么时候为true - Willem Van Onsem
4
@cat: 一个让我省下一些脑力的问题 :) (翻译:@cat:A question that can save me some mental effort :)) - Willem Van Onsem
1
@cat 所以你想把-1,作为真值的两个常用值之一,变成假吗?很好,提出这个问题并让OP决定是明智的。根据dasblinkenlight的被接受的答案,你的猜测和我的猜测一样错误。 - user743382
3个回答

14

假设每个bool代表其对应的short中的一位(这可能是你将大小乘以16的原因),您可以按如下方式进行转换:

bBuf = sBuf
    .SelectMany(s => Enumerable.Range(0, 16).Select(i => (s & (1<<i)) != 0))
    .ToArray();

这个想法是通过调用Enumerable.Range为每个short构造16个布尔值,使用掩码将数字与(1 << i)相乘,并将结果与零进行比较。


构建错误发生。CS0019 '&' 运算符不能应用于类型为 'short' 和 'bool' 的操作数。 - Hoony
不错的方法。您可以通过将 SelectMany 中对 Enumerable.Range(0, 16) 的调用移出并存储在变量中来进行一些优化。 - AFract
@fubo的回答似乎与OP的示例一致,即使问题不太清楚。 - AFract
我仍然不相信LINQ不是魔法。话虽如此,也许只有我觉得这很难读。 - sab669
1
@sab669 请参考这个问答了解如何检查位于位置b的位是否已设置。 - Sergey Kalinichenko
显示剩余4条评论

4
Convert.ToBoolean 的 msdn 页面上可以看到,每个 0 值都会被转换为 false,而每个非 0 值都会被转换为 true
bool[] bBuf = new bool[sBuf.Length];
for(int i = 0; i < sBuf.Length; ++i )
{
    bBuf[i] = Convert.ToBoolean(sBuf[i]);
}

编辑:
根据short值中设置的位来设置您的bool[],您可以使用以下方法:

const int BITS_PER_BYTE = 8; // amount of bits per one byte

int elementBitsSize = sizeof(short) * BITS_PER_BYTE; // size in bits of one element in array
bool[] bBuf = new bool[sBuf.Length * elementBitsSize]; // new array size

// iterate through each short value
for ( int i = 0; i < sBuf.Length; ++i )
{
    // iterate through bits in that value
    for( int j = 0; j < elementBitsSize; ++j )
    {
        // assign new value
        bBuf[j + i * elementBitsSize] = Convert.ToBoolean(sBuf[i] & (1 << j));
    }
}

工作示例

(该链接为工作示例)

3
我觉得这个方案比被选答案的 LINQ 方案更易读。但是,对于提问者来说,这个方案行不通。对于“将 short[] 转换为 bool[]”的明确任务而言,这个方案可以使用(尽管我个人喜欢始终使用 T.TryParse(),除非我能保证数据的完整性)。但是,由于提问者正在处理每个 short 的各个位来构建比他拥有的 shorts 多 16 倍的 bool 值,所以这并不是他实际上正在寻找的。 - sab669

1
// Convert short to bool
bool[] bBuf = Array.ConvertAll(sBuf, n => n != 0);

// Convert short to bit representation bool array
bool[][] bBuf= Array.ConvertAll(arr, n =>
{
    bool[] bits = new bool[16];

    for (int index = 0; index < 16; index++)
    {
        bits[index] = (n & (1 << index)) > 0;
    }

    return bits;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接