我在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
。 (所有其他位应保持不变)
我该如何实现这个
答案 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)