當我們在寫程序的時候,經常會遇到各種各樣的設置,比如設置窗口的四條邊的停靠狀態(比如上邊是否停靠在父控件的上邊上、左邊是否停靠在父控件的左邊上、右邊是否停靠在父控件的右邊上、底邊是否停靠在父控件的底邊上。
方案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; }