简体   繁体   中英

Flags Enum in binary

I met something very strange and i can't understand why it happens. I make this enum :

 [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
}

So i can use it like this :

 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);
        }

But RightClick with value 0x32 doesn't work, for example :

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

How 0x32 & 0x2 != 0x0 ?

Thanks

EDIT

Okei so it s hex and not dec, now here is my code who works :

 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

Thanks all

EDIT 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
}

Is better, thanks kalten

EnumMoveCommand.RightClick = 0x32 = 110010

EnumMoveCommand.Right = 0x2 = 000010

110010 & 000010 = 000010

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

If you want avoid conflic between your enum values you can use the << operator.

[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
}

By the way you could use the HasFlag function like :

commands.HasFlag(EnumMoveCommand.RightClick)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM