BitArray - Shift bits

蹲街弑〆低调 提交于 2019-12-17 07:49:53

问题


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!


回答1:


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.




回答2:


System.Numerics.BigInteger does indeed support bit shifting.




回答3:


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



回答4:


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




回答5:


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.



来源:https://stackoverflow.com/questions/3684002/bitarray-shift-bits

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!