二进制

时间:2016-03-12 22:11:44

标签: c# enums

我遇到了一些非常奇怪的事情,我无法理解为什么会这样。我做这个枚举:

 [Flags]
public enum EnumMoveCommand
{
    None = 0x0,
    Up = 0x1,
    Right = 0x2,
    Bottom = 0x4,
    Left = 0x8,
    LeftClick = 0x16,
    RightClick = 0x32,
    Vertical = Up | Bottom,
    Horizontal = Left | Right,
    Move = Up | Right | Left | Bottom
}

所以我可以这样使用它:

 if ((commands & EnumMoveCommand.Left) != EnumMoveCommand.None)
        {
            MoveToDo.X -= this.speed.X * (float)gameTime.ElapsedGameTime.TotalSeconds;
        }
        if ((commands & EnumMoveCommand.Right) != EnumMoveCommand.None)
        {
            MoveToDo.X += this.speed.X * (float)gameTime.ElapsedGameTime.TotalSeconds;
        }
        if ((commands & EnumMoveCommand.Up) != EnumMoveCommand.None)
        {
            MoveToDo.Y -= this.speed.Y * (float)gameTime.ElapsedGameTime.TotalSeconds;
        }
        if ((commands & EnumMoveCommand.Bottom) != EnumMoveCommand.None)
        {
            MoveToDo.Y += this.speed.Y * (float)gameTime.ElapsedGameTime.TotalSeconds;
        }
        if ((commands & EnumMoveCommand.Horizontal) != EnumMoveCommand.None && (commands & EnumMoveCommand.Vertical) != EnumMoveCommand.None)
        {
            MoveToDo.X = (float)(Math.Cos(45) * MoveToDo.X);
            MoveToDo.Y = (float)(Math.Sin(45) * MoveToDo.Y);
        }

但是值为0x32的RightClick不起作用,例如:

((EnumMoveCommand.RightClick & EnumMoveCommand.Right) != EnumMoveCommand.None)=true

0x32& 0x2!= 0x0?

由于

修改

Okei所以它是十六进制而不是十进制,现在这是我的代码谁工作:

 None = 0x0,
    Up = 0x1,
    Right = 0x2,
    Bottom = 0x4,
    Left = 0x8,
    LeftClick = 0x10,
    RightClick = 0x20,
    Vertical = Up | Bottom,
    Horizontal = Left | Right,
    Move = Up | Right | Left | Bottom

全部谢谢

编辑2

    [Flags]
public enum EnumMoveCommand
{
    None = 0,
    Up = 1<<0, //1
    Right = 1<<1, //2
    Bottom = 1<<2, //4
    Left = 1<<3, //8
    LeftClick = 1<<4, //16
    RightClick = 1<<5, //32
    Vertical = Up | Bottom,
    Horizontal = Left | Right,
    Move = Up | Right | Left | Bottom
}

更好,谢谢kalten

1 个答案:

答案 0 :(得分:1)

EnumMoveCommand.RightClick = 0x32 = 110010

EnumMoveCommand.Right = 0x2 = 000010

110010&amp; 000010 = 000010

所以     ((EnumMoveCommand.RightClick&amp; EnumMoveCommand.Right)!= EnumMoveCommand.None)== true

如果您希望避免枚举值之间发生冲突,可以使用<<运算符。

[Flags]
public enum EnumMoveCommand
{
    None = 0,
    Up = 1<<0, //1
    Right = 1<<1, //2
    Bottom = 1<<2, //4
    Left = 1<<3, //8
    LeftClick = 1<<4, //16
    RightClick = 1<<5, //32
    Vertical = Up | Bottom,
    Horizontal = Left | Right,
    Move = Up | Right | Left | Bottom
}

顺便说一下,您可以使用HasFlag函数,如:

commands.HasFlag(EnumMoveCommand.RightClick)