C # How to convert short [] to bool []?

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... 

But you cannot convert correctly.
I want to convert from short [] to bool [], but I don't know how to do this.

+8
arrays c # boolean short
source share
3 answers

Assuming each bool represents a bit from its corresponding short (which is apparently why you multiplied the size by 16), you can do the conversion as follows:

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

The idea is to construct 16 boolean elements for each short , calling Enumerable.Range , masking the number with (1 << i) and comparing the result to zero.

+14
source share

From the msdn Convert.ToBoolean page Convert.ToBoolean it says that every 0 will be converted to false , and every non 0 be true :

 bool[] bBuf = new bool[sBuf.Length]; for(int i = 0; i < sBuf.Length; ++i ) { bBuf[i] = Convert.ToBoolean(sBuf[i]); } 

EDIT:
When setting up bool[] based on the bit set to short , you can use this:

 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)); } } 

Working example

+4
source share
 // 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; }); 
+1
source share

All Articles