zoukankan      html  css  js  c++  java
  • 枚举、按位与或运算、位移的简单应用

    当我们在写程序的时候,经常会遇到各种各样的设置,比如设置窗口的四条边的停靠状态(比如上边是否停靠在父控件的上边上、左边是否停靠在父控件的左边上、右边是否停靠在父控件的右边上、底边是否停靠在父控件的底边上。

    方案1
    或许你想到的第一个答案是设置四个BOOL值,用C语言实现的代码或许是这样的。

    #include <stdio.h>
    
    typedef char BOOL;
    
    #define True 1
    #define False 0
    
    int main(int argc, const char * argv[]) {
        //定义
        BOOL isTop;
        BOOL isLeft;
        BOOL isRight;
        BOOL isBottom;
        
        //赋值
        isTop = True;
        isLeft = False;
        isRight = True;
        isBottom = False;
        
        //使用
        printf("%d
    ",isTop);
        printf("%d
    ",isLeft);
        printf("%d
    ",isRight);
        printf("%d
    ",isBottom);
        
        return 0;
    }


    这是一种最常用的方式,但是这种只是最笨的一种方式,因为你需要4值来实现整段逻辑。最笨,最常用,但是这也最简单、最容易理解,但是在赋值的时候相对来说你要写四遍。

    方案2
    如果你熟悉内存中数据的保存格式和按位与或运算,你或许会想到这样来解决掉这个问题,对于你这样赋值相对会容易很多

    #include <stdio.h>
    
    #define isDockTop(dock) isDock(dock,isTop)
    #define isDockLeft(dock) isDock(dock,isLeft)
    #define isDockRight(dock) isDock(dock,isRight)
    #define isDockBottom(dock) isDock(dock,isBottom)
    
    typedef char BOOL;
    
    typedef enum{
        isTop       = 1,
        isLeft      = 2,
        isRight     = 4,
        isBottom    = 8
    } Dock;
    
    #define True 1
    #define False 0
    
    BOOL isDock(Dock dock,Dock dockTo)
    {
        return (dock & dockTo) > 0;
    }
    
    int main(int argc, const char * argv[]) {
        //定义
        char dock;
        
        //赋值
        dock = isTop | isRight;
        
        //使用
        printf("isTop	%d
    ",isDockTop(dock));
        printf("isLeft	%d
    ",isDockLeft(dock));
        printf("isRight	%d
    ",isDockRight(dock));
        printf("isBottom	%d
    ",isDockBottom(dock));
        
        return 0;
    }

    可能对于这个编码风格大家还是相对熟悉一些的,因为在赋值的时候,可能会经常的看到这种按位与运算赋值,因为这个赋值实在是太方便了。关于那个枚举的值为什么这么写呢?因为C语言中通用的内存数据保存的原因,深层次的原因,我就不在此赘述。因为这个太基础了。
    或许你现在觉得这个玩意还行,但是枚举的值,太难写了。或许,我们可以通过以下写法来让枚举变得相对简单一些

    typedef enum{
        isTop       = 0B0001,
        isLeft      = 0B0010,
        isRight     = 0B0100,
        isBottom    = 0B1000
    } Dock;

    直接将二进制的数字写到文件里边,Char只有8个bit的还好说一些,但是像int这种有32bit的,早就眼花了把。或许我们可以通过位移来快速方便的解决掉这个问题。


    方案2最终版

    #include <stdio.h>
    
    #define isDockTop(dock) isDock(dock,isTop)
    #define isDockLeft(dock) isDock(dock,isLeft)
    #define isDockRight(dock) isDock(dock,isRight)
    #define isDockBottom(dock) isDock(dock,isBottom)
    
    typedef char BOOL;
    
    typedef enum{
        isTop       = 1,
        isLeft      = 1 << 1,
        isRight     = 1 << 2,
        isBottom    = 1 << 3
    } Dock;
    
    #define True 1
    #define False 0
    
    BOOL isDock(Dock dock,Dock dockTo)
    {
        return (dock & dockTo) > 0;
    }
    
    int main(int argc, const char * argv[]) {
        //定义
        char dock;
        
        //赋值
        dock = isTop | isRight;
        
        //使用
        printf("isTop	%d
    ",isDockTop(dock));
        printf("isLeft	%d
    ",isDockLeft(dock));
        printf("isRight	%d
    ",isDockRight(dock));
        printf("isBottom	%d
    ",isDockBottom(dock));
        
        return 0;
    }
  • 相关阅读:
    laravel基础课程---1、laravel安装及基础介绍(laravel如何安装)
    英语发音规则---gh
    英语影视台词---无敌破坏王2大脑互联网
    C#入门---2、C#装备知识(C#创建桌面程序的时候创建的是什么应用程序)
    android sdk linux 文本 64 位置
    使用内联中间语言
    全栈JavaScript路(八)得知 CDATASection 种类 节点
    HDU-4628 Pieces 如压力DP
    Hadoop加zookeeper构建高可靠集群
    递归嵌套列表
  • 原文地址:https://www.cnblogs.com/anxin1225/p/4063610.html
Copyright © 2011-2022 走看看