Martin
Martin

Reputation: 40613

BitArray - Shift bits

I have a System.Collections.BitArray array (~3000 items) and I would like to shift all the bits to the left by 1. However the collection doesn't seem to support that operation (i.e. bitArray << 1 not working and there is no method). Any idea on how to do that?

Thanks!

Upvotes: 7

Views: 9150

Answers (6)

lastr2d2
lastr2d2

Reputation: 3968

Since Core 2.0 (7 years later after this question was asked) there is a built-in method .LeftShift() for this

BitArray.LeftShift(Int32) Method

Upvotes: 1

user555045
user555045

Reputation: 64933

Recreate bitarray yourself as a wrapper around ulong[]; implementing bitshifts by a number smaller than 64 is a piece of cake that way and it will take less time and kill fewer polar bears than the other suggested approaches. By wary of the "bits that would fall of the end", if you want to keep them you may have to grow the array (or not, if they are zero and you say that non-existing element implicitly hold zero).

Upvotes: 1

eye
eye

Reputation: 304

I am not sure how about efficiency but this extension method does the job

public static BitArray ShiftRight(this BitArray instance)
{
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}

Upvotes: 2

Dale Barnard
Dale Barnard

Reputation: 829

System.Numerics.BigInteger does indeed support bit shifting.

Upvotes: 2

Alex Paven
Alex Paven

Reputation: 5549

The easiest way I'd go for off the top of my head is to convert the BitArray to a BigInt or similar structure that supports bitwise shifting and back. Now, the built-int BigInteger in .Net 4 doesn't support shifting I think, but there are others that do, like Mono's implementation.

Upvotes: 0

Frank Bollack
Frank Bollack

Reputation: 25196

This simple snippet shows a manual way to do it. The value of bitArray[0] is overwritten:

//... bitArray is the BitArray instance

for (int i = 1; i < bitArray.Count; i++)
{
   bitArray[i - 1] = bitArray[i];
}

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in

Making this an extension method shouldn't be a big deal.

Upvotes: 6

Related Questions