首页 > 解决方案 > 右移运算符在标志枚举中不起作用

问题描述

我有以下带有标志属性的枚举:

[Flags]
public enum MyEnum
{
    None = 0,
    First = 1,
    Second= 2,
    Third= 4,
       .
       .
       .
    Unknown = All >> 1,
    All = ~None,
}

我希望该Unknown值是该值之前的最后一个All。所以我认为右移运算符会完成这项工作,但是当我像这样将两个值打印到控制台时:

Console.WriteLine((int)MyEnum.All);
Console.WriteLine((int)MyEnum.Unknown);

它打印-1-1. 我做错了什么,如何修改代码以使其Unknown正确All

编辑:感谢大家的回答,我忽略了右移运算符执行算术移位并“将符号位传播到高阶空位位置”。最后,我意识到我的方法无论如何都会给我错误的结果,因为MyEnum.Unknown.HasFlag(MyEnum.First);它会返回 true,这将是不正确的行为。这个答案为我指明了正确的方向,我开始Unknown着手int.MinValue,这正是我想要实现的目标——我想像Unknown其他任何价值一样,也想成为可能的最高价值。现在我只是很尴尬,我之前没有考虑过这个......

标签: c#

解决方案


看来你想All成为0xFFFFFFFFUnknown成为0x8000000这样Unknown包含在All. 有趣的想法。也许0x7FFFFFFF并且0x8000000会更有意义:

using System;
                    
public class Program
{
    [Flags]
    public enum MyEnum : uint
    {
    None = 0,
    First = 1,
    Second= 2,
    Third= 4, // ...
    Unknown = (uint)1 << 31, // Most-significant-bit.
    All = ~Unknown}

    public static void Main()
    {
        Console.WriteLine("All: " + ((uint)MyEnum.All).ToString("X"));
        Console.WriteLine("Unknown: " + ((uint)MyEnum.Unknown).ToString("X"));
    }
}

.NETfiddle


推荐阅读