枚举、按位与或运算、位移的简单应用

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

方案1

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

#include <stdio.h>typedefcharBOOL;#defineTrue 1#defineFalse 0intmain(intargc,constchar*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);return0;

}

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

方案2

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

#include <stdio.h>#defineisDockTop(dock) isDock(dock,isTop)#defineisDockLeft(dock) isDock(dock,isLeft)#defineisDockRight(dock) isDock(dock,isRight)#defineisDockBottom(dock) isDock(dock,isBottom)typedefcharBOOL;

typedefenum{

isTop=1,

isLeft=2,

isRight=4,

isBottom=8} Dock;#defineTrue 1#defineFalse 0BOOL isDock(Dock dock,Dock dockTo)

{return(dock & dockTo) >0;

}intmain(intargc,constchar*argv[]) {//定义chardock;//赋值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));return0;

}

可能对于这个编码风格大家还是相对熟悉一些的,因为在赋值的时候,可能会经常的看到这种按位与运算赋值,因为这个赋值实在是太方便了。关于那个枚举的值为什么这么写呢?因为C语言中通用的内存数据保存的原因,深层次的原因,我就不在此赘述。因为这个太基础了。

或许你现在觉得这个玩意还行,但是枚举的值,太难写了。或许,我们可以通过以下写法来让枚举变得相对简单一些

typedefenum{

isTop=0B0001,

isLeft=0B0010,

isRight=0B0100,

isBottom=0B1000

} Dock;

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

方案2最终版

#include <stdio.h>#defineisDockTop(dock) isDock(dock,isTop)#defineisDockLeft(dock) isDock(dock,isLeft)#defineisDockRight(dock) isDock(dock,isRight)#defineisDockBottom(dock) isDock(dock,isBottom)typedefcharBOOL;

typedefenum{

isTop=1,

isLeft=1<<1,

isRight=1<<2,

isBottom=1<<3} Dock;#defineTrue 1#defineFalse 0BOOL isDock(Dock dock,Dock dockTo)

{return(dock & dockTo) >0;

}intmain(intargc,constchar*argv[]) {//定义chardock;//赋值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));return0;

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航