2017-04-06 23 views
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... 

Nhưng không thể chuyển đổi chính xác.
Tôi muốn chuyển đổi từ ngắn [] thành bool [], nhưng tôi không biết làm thế nào.C# Cách chuyển đổi ngắn [] thành bool []?

+11

Khi nào phần tử 'bool' phải là' true'? –

+4

@cat: một câu hỏi để tiết kiệm cho tôi một số chu kỳ não :) –

+1

@cat Vì vậy, bạn muốn biến -1, một trong hai giá trị thường được sử dụng cho đúng, thành sai? Bạn nên đặt câu hỏi và để OP quyết định. Và dựa trên câu trả lời được chấp nhận của dasblinkenlight, dự đoán của bạn sẽ sai lầm như dự đoán của tôi. – hvd

Trả lời

14

Giả sử rằng mỗi bool đại diện cho một chút từ của nó tương ứng short (mà có lẽ là lý do tại sao bạn nhân với kích thước bằng 16), bạn có thể thực hiện chuyển đổi như sau:

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

Ý tưởng là để xây dựng 16 booleans cho mỗi short bằng cách gọi Enumerable.Range, che số bằng (1 << i) và so sánh kết quả bằng không.

+0

Lỗi xây dựng xảy ra. CS0019 '&' Nhà điều hành không thể áp dụng cho các toán hạng kiểu 'ngắn' và 'bool' – Hoony

+0

@Hoony Tôi đã chỉnh sửa câu trả lời sau khi bạn sao chép mã. Một cặp dấu ngoặc đơn bị thiếu. Vui lòng thử lại. – dasblinkenlight

+0

@Hoony bạn nên sử dụng câu trả lời được cập nhật với dấu ngoặc xung quanh 's & (1 << i)' thực sự bạn có thể xóa dấu ngoặc bên trong: 'i => (s & 1 << i)! = 0' nhưng không thể đọc được –

4

Từ trang MSDN của Convert.ToBoolean nó nói rằng tất cả các giá trị 0 sẽ được chuyển đổi sang false và mỗi 0 giá trị phi để true:

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

EDIT:
Thiết bạn bool[] dựa trên bit đặt trong Giá trị short bạn có thể sử dụng:

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

+3

Tôi thích giải pháp này, theo ý kiến ​​của tôi, ** xa hơn ** dễ đọc hơn giải pháp LINQ của Người trả lời được chọn. Điều đó nói rằng, điều này sẽ không làm việc cho OP. Đối với nhiệm vụ rõ ràng của "convert short [] thành bool []" nó là tốt (mặc dù cá nhân tôi thích luôn sử dụng 'T.TryParse()' trừ khi tôi có thể đảm bảo tính toàn vẹn của dữ liệu) nhưng vì OP đang xử lý các bit riêng lẻ của mỗi 'short' để xây dựng các giá trị' bool' cao gấp 16 lần so với 'short'' của anh ta không phải là những gì anh ta thực sự * đang tìm kiếm – 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; 
}); 
Các vấn đề liên quan