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

小近 发布于 2014/10/31 10:25
阅读 224
收藏 0
 作者:近乎团队
  当我们在写程序的时候,经常会遇到各种各样的设置,比如设置窗口的四条边的停靠状态(比如上边是否停靠在父控件的上边上、左边是否停靠在父控件的左边上、右边是否停靠在父控件的右边上、底边是否停靠在父控件的底边上。


  方案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;


  }

更多详情:近乎sns开发分享社区

加载中
返回顶部
顶部