国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

枚舉、按位與或運算、位移的簡單應用

2019-11-14 19:55:13
字體:
來源:轉載
供稿:網友

當我們在寫程序的時候,經常會遇到各種各樣的設置,比如設置窗口的四條邊的停靠狀態(比如上邊是否停靠在父控件的上邊上、左邊是否停靠在父控件的左邊上、右邊是否停靠在父控件的右邊上、底邊是否停靠在父控件的底邊上。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渭南市| 洮南市| 海丰县| 娱乐| 云霄县| 旬阳县| 长沙市| 苏尼特右旗| 望都县| 长兴县| 岱山县| 侯马市| 梅河口市| 汝州市| 芜湖县| 临潭县| 江津市| 青阳县| 鄂温| 沙洋县| 密山市| 大荔县| 本溪| 五原县| 上犹县| 六枝特区| 土默特右旗| 龙山县| 汨罗市| 香港| 宁陵县| 泰安市| 资源县| 莆田市| 麻栗坡县| 修武县| 团风县| 安仁县| 长寿区| 莱州市| 西平县|