枚举值的组合使用


    有时候枚举只返回一项会显得不够用,比如新建一个枚举类型week它总共有7项分别代表周日到周一,声明一个week类型的枚举值work用来表示一个人的值日安排,这个人的值日安排可能不止一天,如果work的值只能为week7个枚举项中的一个显然是不够用的。这时候就需要用到枚举的组合。

|和||,&和&&的区别

想要使用枚举的组合就需要知道|和||。&和&&之间的关系

“|”和“||”

“|”和“||”都可以表示逻辑或运算,不同的是做逻辑或运算时”|”会检查每一个条件再进入下一步,而”||”则相反,它会从左往右直到遇到条件为真就立即进入下一步。

“&”和“&&”

“&”和“&&”都可以表示逻辑与运算,不同的是做逻辑与运算时”&&”会检查每一个条件再进入下一步,而”&&”则相反,它会从左往右直到遇到条件为假就跳出然后进入下一步不再检验剩余条件是否成立。这也是”&&“的短路功能。


ps: “&”和”|”与”&&”和”||”相比还多了位运算的功能,当&的两边不是布尔类型时&表示按位与运算;当”|“的两边不是布尔类型时”|“表示按位或运算。**

//test.h
#include<stdio.h>
#include<string.h>
typedef enum WEEK {
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday=64
}Week;

void printWeek(Week src)
{
    char dst[MAXSIZE] = { 0 };
    if ((src&Monday) == Monday)
        strcat(dst, "Monday ");
    if ((src&Tuesday) == Tuesday)
        strcat(dst, "Tuesday ");
    if ((src&Wednesday) == Wednesday)
        strcat(dst, "Thursday ");
    if ((src&Thursday) == Thursday)
        strcat(dst, "Monday ");
    if ((src&Friday) == Friday)
        strcat(dst, "Friday ");
    if ((src&Saturday) == Saturday)
        strcat(dst, "Saturday ");
    if ((src&Sunday) == Sunday)
        strcat(dst, "Sunday ");
    printf("%s", dst);
};
int main()
{
    Week work = Monday | Thursday | Saturday;
    printWeek(work);
    getchar();
    return 0;
}

运行结果如下:
这里写图片描述

这种组合使用是基于二进制和位运算的原理,在定义枚举Week时 每个枚举项的值都为2的次方,转化为二进制就会出出现只有1位为1其他位都为0的情况。这样在两个值为 2的不同次幂的或运算后他们各自的标志位就会整合到一块。再与其它枚举值做按位与就可以知道是否含有此枚举值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值