在int中设置特定位

时间:2014-06-16 19:14:48

标签: c# bit-manipulation

我需要通过在每个可能的数据库值的int值中设置特定位来屏蔽从数据库读取的某些字符串值。例如,如果数据库返回字符串“value1”,则位置0中的位需要设置为1,但如果数据库返回“value2”,则位置1中的位将需要设置为1。 / p>

如何确保int的每个位最初设置为0然后再打开指定的位?

4 个答案:

答案 0 :(得分:34)

如果你有一个int值" intValue "并且你想在位置" bitPosition "设置一个特定的位,做类似的事情:

intValue = intValue | (1 << bitPosition);

或更短:

intValue |= 1 << bitPosition;


如果要重置一位(即将其设置为零),可以执行以下操作:

intValue &= ~(1 << bitPosition);

(运算符~反转值中的每个位,因此~(1 << bitPosition)将产生 int ,其中每个位都是 1 ,除了位于给定 bitPosition 的位。)

答案 1 :(得分:6)

将所有内容设置为0,将值设置为0x00000000:

int startValue = initialValue & 0x00000000;
//Or much easier :)
int startValue = 0;

要设置该位,您必须确定仅位设置的数字和OR。例如,要设置最后一位:

int finalValue = startValue | 0x00000001;

正如@Magus指出的那样,为了取消设置,你会做出完全相反的事情:

int finalValue = startValue & 0xFFFFFFFE;
//Or
int finalValue = startValue & ~(0x00000001);

〜操作符是按位而不是,它会翻转每一位。

答案 2 :(得分:1)

所以,这个?

enum ConditionEnum 
{
    Aaa = 0,
    Bbb = 1,
    Ccc = 2,
}    

static void SetBit(ref int bitFlag, ConditionEnum condition, bool bitValue)
{
    int mask = 1 << (int)condition;
    if (bitValue)
        bitFlag |= mask;
    else
        bitFlag &= ~mask;
}

答案 3 :(得分:-2)

只需提供一个值、位值和位置。请注意,您可能可以修改它以适用于其他类型。

public static void SetBit(ref int value, bool bitval, int bitpos)
    {
        if (!bitval) value&=~(1<<bitpos); else value|=1<<bitpos;
    }