c# - 右移运算符在标志枚举中不起作用
问题描述
我有以下带有标志属性的枚举:
[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
其他任何价值一样,也想成为可能的最高价值。现在我只是很尴尬,我之前没有考虑过这个......
解决方案
看来你想All
成为0xFFFFFFFF
和Unknown
成为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"));
}
}
推荐阅读
- mongodb - 在 Mongo ReplicaSet 中更新 mongo SSL-Cerificates
- ios - 使用 Core Data 从后台线程获取
- python - 用树莓派播放音乐的可能性有哪些
- swift - 如何固定 tableHeaderView?
- java - 未能执行目标 org.apache.maven.plugins:maven-dependency-plugin:2.9:analyze-only (默认)
- azure-pipelines - 在哪里可以找到不同 msbuildargs 选项的文档?
- google-cloud-platform - 根据 HTTP 状态代码为 GCP Cloud Functions 设置提醒政策
- angular - 从导入的组件调用当前组件方法 - 不是父子概念
- python - 试图让我的代码更新球员得分,如果两名球员要平局
- python - models.py 类中的独特组合?