不同长度BitArrays上的按位运算符

时间:2014-02-27 15:59:43

标签: c# bitwise-operators bitarray

我有2个BitArray项目,我需要知道每个中的任何位是否相同,“AND”。 但是,BitArrays的长度可以不同,而ether 1可以比另一个更大或更小。

如何进行两个BitArrays的“AND”,而不会因为大小不同而出现异常? 这将发生很多,所以我需要它相当快。

实施例

  int[] ids = new int[3];
  ids[0] = 1;
  ids[1] = 3;
  ids[2] = 5;
  BitArray bs1 = new BitArray(ids.Max()+1);
  for (int i = 0; i < ids.Count(); ++i)
  {
    bs1[ids[i]] = true;
  }


  ids[0] = 1;
  ids[1] = 59;
  ids[2] = 1111;
  BitArray bs2 = new BitArray(ids.Max()+1);
  for (int i = 0; i < ids.Count(); ++i)
  {
    bs2[ids[i]] = true;
  }

  ids[0] = 0;
  ids[1] = 5;
  ids[2] = 33;
  BitArray bs3 = new BitArray(ids.Max()+1);
  for (int i = 0; i < ids.Count(); ++i)
  {
    bs3[ids[i]] = true;
  }


  //if bs1 AND bs2 bitcount > 0 DisplayMessage("1 and 2 has some same items")
  //if bs1 AND bs3 bitcount > 0 DisplayMessage("1 and 3 has some same items")
  //if bs2 AND bs3 bitcount > 0 DisplayMessage("2 and 3 has some same items")

为解决我的问题,我修改了BitArray代码并添加了以下内容

public static MyBitArray TruncateCopy(MyBitArray source, int size)
{
  MyBitArray dest = new MyBitArray(size);

  //copy all the arrays
  for (int i = 0; i < dest.m_array.Length; ++i)
  {
    dest.m_array[i] = source.m_array[i];
  }

  //remove any of the items over the given size
  for (int i = ((size % 32) + 1); i < 32; ++i)
  {
    dest.m_array[i >> 5] &= ~(1 << (i & 31));
  }

  return dest;
}

public bool HasCommonBits(MyBitArray comp)
{
  MyBitArray copied, other;

  if (this.Length < comp.Length)
  {
    other = this;
    copied = TruncateCopy(comp, this.Length);
  }
  else
  {
    copied = TruncateCopy(this, comp.Length);
    other = comp;
  }

  MyBitArray compareEq = copied.And(other);

  return (!compareEq.IsEmpty());
}

public bool IsEmpty()
{
  for (int i = 0; i < this.m_array.Length; ++i)
  {
    if (m_array[i] != 0)
      return false;
  }

  return true;
}

public bool IsFull()
{
  //run through all the full sets
  for (int i = 0; i < this.m_array.Length - 1; ++i)
  {
    if (m_array[i] != -1) //-1 is all bits set in an integer
      return false;
  }

  //go through the partial one
  for (int i = 0; i < (this.Length % 32); ++i)
  {
    if (!this[i])
      return false;
  }

  return true;
}

}

2 个答案:

答案 0 :(得分:1)

首先,定义在长度不同的情况下您想要发生的事情。也许你只想比较第一个Math.Min(len1, len2)元素。在这种情况下,写一个for循环,其索引变量范围从0到Math.Min(len1, len2)。比较循环体中的相应数组元素。

我用反射器检查了BitArray无法修剪它,或执行部分And。你在这堂课上运气不好。将其替换为支持您需要的自定义编写的类。编写位数组并不是特别困难。

答案 1 :(得分:0)

根据此评论完全修订:

  

你的例子的结果bitarray将是01010.我的原始问题表明我需要查看是否有任何位是相同的。因此,任何1的结果比特数将为True,并且所有0将为False

BitArrray truncateCopyBA(BitArray source, int size)
{
    BitArray dest = new BitArray(size);

    for(int i = 0; i < size; ++i)
    {
        dest[i] = source[i];
    }

    return dest;
}

bool YourFunc(BitArray a, BitArray b)
{
    BitArray one, two;

    if (a.Length < b.Length)
    {
        one = a;
        two = truncateCopyBA(b, a.Length);
    }
    else
    {
        one = truncateCopyBA(a, b.Length);
        two = b;

        // If you want to see which bits in both arrays are both ones, then use .And()
        // If you want to see which bits in both arrays are the same, use .Not(.Xor()).
        BitArray compareEq = a.And(b);
        bool anyBitsSame=false;
        for(int i = 0; i < compareEq.Length; ++i)
        {
            if(compareEq.Get(i))
            {
                return true;
            }
        }

        return false
    }
}

我相信这是你正在寻找的,但说实话,你的问题在澄清之后仍然很模糊。