当我们在写程序的时候,经常会遇到各种各样的设置,比如设置窗口的四条边的停靠状态(比如上边是否停靠在父控件的上边上、左边是否停靠在父控件的左边上、右边是否停靠在父控件的右边上、底边是否停靠在父控件的底边上。
方案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;}
新闻热点
疑难解答