枚舉、按位與或運算、位移的簡單應用


當我們在寫程序的時候,經常會遇到各種各樣的設置,比如設置窗口的四條邊的停靠狀態(比如上邊是否停靠在父控件的上邊上、左邊是否停靠在父控件的左邊上、右邊是否停靠在父控件的右邊上、底邊是否停靠在父控件的底邊上。

方案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\n",isTop);
    printf("%d\n",isLeft);
    printf("%d\n",isRight);
    printf("%d\n",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\t%d\n",isDockTop(dock));
    printf("isLeft\t%d\n",isDockLeft(dock));
    printf("isRight\t%d\n",isDockRight(dock));
    printf("isBottom\t%d\n",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\t%d\n",isDockTop(dock));
    printf("isLeft\t%d\n",isDockLeft(dock));
    printf("isRight\t%d\n",isDockRight(dock));
    printf("isBottom\t%d\n",isDockBottom(dock));
    
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM