2009-02-05 4 views
6

나는두 개의 BitArray (C# .NET)를 연결하는 간단한 방법이 있습니까?

var previous = new BitArray(new bool[]{true}); 
var current = new BitArray(new bool[]{false}); 

내가 그들을 연결 할 수 있습니다. 이미 시도 :

var next = new BitArray(previous.Count + current.Count); 
var index = 0; 
for(;index < previous.Count; index++) 
    next[index] = previous[index]; 
var j = 0; 
for(;index < next.Count; index++, j++) 
    next[index] = current[j]; 
previous = current; 

그러나 최선의 방법으로 보이지 않습니다.

답변

7

불행히도 귀하의 방법이 좋은 것처럼 보입니다. BitArray가 IEnumerable <T> (IEnumerable 대신)을 구현 한 경우 LINQ 확장 메서드를 사용하여 좀 더 예쁘게 만들 수 있습니다. 내가 당신이라면

, 나는 BitArray에 확장 방법으로이 문제를 마무리 것 :

public static BitArray Prepend(this BitArray current, BitArray before) { 
    var bools = new bool[current.Count + before.Count]; 
    before.CopyTo(bools, 0); 
    current.CopyTo(bools, before.Count); 
    return new BitArray(bools); 
} 

public static BitArray Append(this BitArray current, BitArray after) { 
    var bools = new bool[current.Count + after.Count]; 
    current.CopyTo(bools, 0); 
    after.CopyTo(bools, current.Count); 
    return new BitArray(bools); 
} 
+2

하는 경우를 첫 번째 배열에는 32 비트의 짝수 배가 포함되어 있다는 것을 알 수 있습니다. bool 배열 대신 int 배열을 사용하여이를 크게 최적화 할 수 있습니다. CopyTo는 int [], bool [] 및 byte []로 작동합니다. –

2

프레임 워크를이 일의 좋은 방법을 제공하지 않습니다. 두 개의 BitArray를 저장할 수있는 크기의 bool 배열을 만들 수 있습니다. 그런 다음 BitArray.CopyTo를 사용하여 각 BitArray를 bool 배열에 복사합니다 (요소를 삽입 할 위치를 지정할 수 있음).

이 작업이 끝나면 bool 배열을 허용하는 생성자를 사용하여 다른 BitArray를 만듭니다.

내가 아는 작품이 많이 있지만 다른 방법으로 보이지 않습니다. 그러나 현재 방법보다 코드가 적습니다.

5

하나는 Cast<bool>() bitarray 후 '된다'IEnumerable<bool>, LINQ하여이 작업을 수행 할 수 있습니다

var previous = new BitArray(new bool[] { true }); 
var current = new BitArray(new bool[] { false }); 

BitArray newBitArray = 
    new BitArray(previous.Cast<bool>().Concat(current.Cast<bool>()).ToArray()); 

내가이 LINQ 방법은 빠른 것입니다 생각하지 않습니다.

-1

bitarray가 int32를 내부적으로 사용하기 때문에 bool 대신 int32를 사용하면 더 효율적입니다.

public static BitArray Append(this BitArray current, BitArray after) { 
    var ints = new int[(current.Count + after.Count)/32]; 
    current.CopyTo(ints, 0); 
    after.CopyTo(ints, current.Count/32); 
    return new BitArray(ints); 
} 

Vb.net에서 사람이 필요하면 다음과 같습니다

<Runtime.CompilerServices.Extension()> _ 
Public Function Append(ByVal current As BitArray, ByVal after As BitArray) As BitArray 
    Dim ints = New Int32((current.Count + after.Count) \ 32 - 1) {} 
    current.CopyTo(ints, 0) 
    after.CopyTo(ints, current.Count \ 32) 
    Return New BitArray(ints) 
End Function 
+2

이 코드는 들어오는 비트 배열의 길이가 32의 배수 인 경우에만 작동합니다. 그렇지 않으면 32로 정수를 나눈 결과가 반올림되므로 범위를 벗어납니다. 'ints'를 너무 짧게 만든다. 'ints'를 길게 만드는 것 또한 충분하지 않습니다. 왜냐하면 'current'길이가 32의 배수가 아니라면, 추가 된 배열은 중간에 사용하지 않는 비트를 남겨두기 때문입니다. –

+0

좋은 생각이긴하지만 @KristianWedberg가 언급 한 것처럼 이것은 (희귀 한) 특정 조건에서만 작동합니다. – larsmoa

0

입니다 bools의 배열 할당해야하는 오버 헤드가 포함되지 않습니다 내 LINQ 구현 :

var result = new BitArray(first.Count + second.Count); 

var i = 0; 
foreach (var value in first.Cast<bool>().Concat(second.Cast<bool>())) 
{ 
    result[i++] = value; 
}