當我們在寫程序的時候,經常會遇到各種各樣的設置,比如設置窗口的四條邊的停靠狀態(比如上邊是否停靠在父控件的上邊上、左邊是否停靠在父控件的左邊上、右邊是否停靠在父控件的右邊上、底邊是否停靠在父控件的底邊上。
方案1
或許你想到的第一個答案是設置四個BOOL值,用C語言實現的代碼或許是這樣的。
#include <stdio.h>typedef char BOOL;#define True 1#define False 0int 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 0BOOL 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 0BOOL 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;}
新聞熱點
疑難解答