问题描述
如果我想检查是否设置了特定的位,那么我认为是一个简单而快速的代码
bool setbit(int number,int position)
{
return ((number) & (1 << position)) != 0
}
现在,如果我有两个整数并要检查每个整数中的2位(4个位置总是不同)怎么办?如果所有功能都设置在指定位置,则该函数应返回true。
解决方法
检查掩码中给定的所有位是否都设置为数字的一般方法是:
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;
}