C#中Uint32位域的位操作

时间:2017-01-15 21:41:01

标签: c#

我在C#中有两个枚举

public class PlayerAttributes 
{

        private UInt32 m_AttributeFlagsMask;
        private UInt32 m_AttributeFlagsBitmap;

        [Flags]
        public enum EAttributesFlagsBmp
        {
           AIn = 0,
           BIn = (1 << 1),  //1
           CIn = (1 << 2),  //2
           DIn = (1 << 3),  //4 
           EIn = (1 << 4), //8
           FIn = (1 << 5),  //16
           GIn = (1 << 6)  //32
        }

        [Flags]
        public enum EAttributeFlagsMask
        {
            None = 0,
            AIn = (1 << 1),     //1
            BIn = (1 << 2),  //2
            CIn = (1 << 3),   //4
            DIn = (1 << 4),  //8
            EIn = (1 << 5),  //16
            FIn = (1 << 6)  //32
        }

        public UInt32 AttributeFlagsMask { get { return m_AttributeFlagsMask; } private set { m_AttributeFlagsMask = value; } }
        public UInt32 AttributeFlagsBmp { get { return m_AttributeFlagsBmp; } private set { m_AttributeFlagsBmp = value; } }

        public bool SetAInAndBIn(bool a_in, bool b_in)
        {
            if(a_in && !b_in)
            {
                   UInt32 flag = ((UInt32)PlayerAttributes.EAttributesFlagsBmp.AIn | ~(UInt32)PlayerAttributes.EAttributesFlagsBmp.BIn);

            }else if(bin && !a_in)
            {
                   UInt32 flag = (~(UInt32)PlayerAttributes.EAttributesFlagsBmp.AIn | (UInt32)PlayerAttributes.EAttributesFlagsBmp.BIn);

            }
            AttributeFlagsBmp  = flag  

            return true;
        }
}

上面的代码似乎没有正确设置值。 我想要的是

应设置

case 1 AIn,并且应取消设置BIn。 (所有其他位应保​​持不变)

和 应设置case 2 BIn,并且应取消设置AIn。 (所有其他位应保​​持不变)

我该如何实现这个

1 个答案:

答案 0 :(得分:0)

不确定这是否是您想要的,但如果是以下行

Fs=1;
t=-10:1/Fs:10;
g=t;
g(g~=1)=0;  %g function
s=sign(t);
x=g.*s;
f=t;
f(f>-1 & f<2)=1;
f(f~=1)=0;  %f function
x2=f;
spl=conv(x,x2,'same');
disp(spl)

预计设置A并取消设置B,而不更改其他,它将无法工作(它实际上将翻转所有其他)。要设置A并取消设置B而不更改任何其他内容,您应该使用:

((UInt32)PlayerAttributes.EAttributesFlagsBmp.AIn | ~(UInt32)PlayerAttributes.EAttributesFlagsBmp.BIn)

就像常规布尔值一样,当否定一方时,你需要在比较中改变或改为And(反之亦然)以保持相同的行为。

编辑:

设置时擦除其他标志的原因是因为您只在属性上设置了这两个标志,然后通过在属性上设置值来覆盖属性上存在的任何内容。要仅更改属性上已有的值,必须对其值使用适当的运算符,然后将其设置回来。像这样:

((UInt32)PlayerAttributes.EAttributesFlagsBmp.AIn & ~(UInt32)PlayerAttributes.EAttributesFlagsBmp.BIn)