C#之枚举中的按位与(&)按位或(|)。

一些基础定义:

csharp 复制代码
按位或运算符(|)是一种位运算符,用来对两个二进制数进行操作。对于每个位上的1,如果至少有一个二进制数中的对应位为1,则结果为1;否则,结果为0。
csharp 复制代码
按位与运算符(&)是一种位运算符,用来对两个二进制数进行操作。对于每个位上的1,如果两个二进制数中的对应位为1,则结果为1;否则,结果为0。

先看代码:

csharp 复制代码
[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring
}


 //枚举


        var spring = Seasons.Spring;
        var startingOnEquinox = Seasons.Spring | Seasons.Autumn;
        var theYear = Seasons.All;


        if (spring.HasFlag(Seasons.Spring)) Console.WriteLine("春天来了");

        if (theYear.HasFlag(Seasons.Winter)) Console.WriteLine("冬天来了");
        if (startingOnEquinox.HasFlag(Seasons.Autumn)) Console.WriteLine("秋天来了");
		Console.WriteLine("C#牛皮。C#接单QQ群 452760896");

这是一个表示季节的枚举,主要看最后一个ALL 他表示上面所有季节的枚举。

很多人有时候会不知所以然。

今天详细解释下:

为什么ALL包含上面所有的季节选项,我们通过二进制计算下。

csharp 复制代码
当使用位运算符按位或(|)将枚举常数的值进行操作时,它的原理是将各个二进制位对应的数值进行合并。对于每个位上的1,如果至少有一个枚举常数中对应位为1,则结果为1;否则,结果为0。

假设一个枚举类型中有4个枚举常数如下: Summer: 0001 Autumn: 0010 Winter: 0100 Spring: 1000

按位或操作的结果为: 0001 | 0010 | 0100 | 1000 = 1111

得到了二进制数1111,转换为十进制数即为15。所以,All枚举常数的值为15,表示All代表所有的季节,包括Summer,Autumn,Winter和Spring。

这种按位或运算的机制可以将多个二进制数的对应位合并起来,以获得一个包含多个选项的组合值。在使用枚举时,可以通过进行按位与运算(&)来判断一个特定的选项是否包含在枚举常数中。如果按位与运算的结果不为0,则表示包含在其中;否则,表示不包含。

计算的结果为ALL15对应的二进制为:1111

又因为HasFlag这个方法底层其实是在进行按位与(&)计算,判断当前值为不为0如果是0就返回false

比如这句代码:if (theYear.HasFlag(Seasons.Winter)) Console.WriteLine("冬天来了");
theYear表示的二进制是1111
Seasons.Winter表示的二进制是0100 他俩按位与返回的值是0100也就是Seasons.Winter自己。所以返回True

csharp 复制代码
这里强调下,如果要用按位与或者或请一定要让有效值是2的次方。因为是二进制嘛。
csharp 复制代码
[Flags] 是一个特性(Attribute),用于标记枚举类型支持按位组合的选项。

当在枚举类型上应用 [Flags] 特性时,它告诉编译器该枚举类型的值可以进行按位组合。这样一来,可以使用按位或操作符(|)将多个枚举常数的值组合成一个新的枚举值。

在上面的示例中,使用 [Flags] 特性修饰了 Seasons 枚举类型。这表示枚举类型 Seasons 的值可以进行按位组合。

当使用 [Flags] 特性时,建议为枚举类型指定具有特殊含义的值,如 None 和 All,以及按位组合的其它枚举常数。

运行结果:

相关推荐
加号34 小时前
【C#】 字符串字节到十六进制字节数组的转换解析
c#
JaydenAI5 小时前
[MAF的Agent管道详解-04]如何让LLM按照要求的结构输出数据?
ai·c#·agent·maf·agent pipeline
不会编程的懒洋洋7 小时前
VisionPro 中 几何相交工具 Geometry-Intersection
图像处理·笔记·c#·视觉检测·机器视觉·visionpro
不会编程的懒洋洋10 小时前
VisionPro 中 图像预处理工具
图像处理·笔记·c#·视觉检测·visionpro
雪豹阿伟12 小时前
9.C# —— string拓展方法、StringBuilder高性能处理
c#·上位机
李星星_Alex12 小时前
如何通过 C# 抓取抖音 RTMP 推流码实现自主推流
c#·抖音
qq74223498416 小时前
全面深入的C#核心知识体系与编程实践精要——从语法基础到高级特性系统学习指南
java·算法·c#
fai厅的秃头姐!17 小时前
2586. 统计范围内的元音字符串数
开发语言·c#
正运动技术18 小时前
C#运动控制开源(二): CAD导图和小线段速度前瞻优化
c#·正运动技术·运动控制器·运动控制卡·正运动控制器·运动控制开源·ethercat运动控制器
楼田莉子18 小时前
C#学习:分支与循环
服务器·后端·学习·c#