检查更多整数不同设置位的最快方法

问题描述

如果我想检查是否设置了特定的位,那么我认为是一个简单而快速代码

bool setbit(int number,int position)
{ 
  return ((number) & (1 << position)) != 0
}

现在,如果我有两个整数并要检查每个整数中的2位(4个位置总是不同)怎么办?如果所有功能都设置在指定位置,则该函数应返回true。

有没有比调用所示函数4次更好的方法了?

解决方法

检查掩码中给定的所有位是否都设置为数字的一般方法是:

requires boolean<sizeof...(Ts) <= 3> && boolean<(std::same_as<Ts,int> && ...)>

在这种情况下,可以通过在给定位置设置位来制作掩码:

(number & mask) == mask

总共

int mask = (1 << pos1) | (1 << pos2) | (1 << pos3) | (1 << pos4);
,

harolds答案的更灵活版本

用法

BitsAreSet(0b10011001,3,4,7); // check 4 bits
BitsAreSet(0b10011001,0); // check only 1 bit

实施

public static bool BitsAreSet(int number,params int[] bitPositions)
{
      var mask = 0;

      foreach (var bitPosition in bitPositions)
          mask |= (1 << bitPosition);

      return (number & mask) == mask;
}

扩展方法版本

我必须添加它,因为我是扩展方法的粉丝。

用法

0b10011010.BitsAreSet(0,7)

实施

public static bool BitsAreSet(this int number,params int[] bitPositions)
{
    var mask = 0;

    foreach (var bitPosition in bitPositions)
        mask |= (1 << bitPosition);

    return (number & mask) == mask;
}