colonleado's

          關于游戲也關于技術 im Co
          數據加載中……
          位操作在實際開發中的應用
          位操作就是將10進制數想為“01010000111”這樣的2進制形式去運算、操作 常用運算符有|&<<>>^等

          在C++的開發里一般是不推薦使用位操作的,因為會降低代碼的可讀性。而且J2me開發中因為內存、運算速度等諸多原因,所以推薦使用位操作。

          實際應用1:按鍵處理
          首先在我們的主Canvas里要調用
           1/**
           2     * 鍵盤接收
           3     */

           4    protected void keyPressed(int keyCode) {
           5        
           6        CType.setKeyState(keyCode);
           7        
           8    }

           9
          10    /**
          11     * 鍵盤放開處理
          12     */

          13    protected void keyReleased(int keyCode) {
          14        
          15        CType.clearKeyState(keyCode);
          16        
          17    }

          然后在我的CType里面:
            1public static final int K_UP = 1;
            2    public static final int K_DOWN = 1 << 1;
            3    public static final int K_LEFT = 1 << 2;
            4    public static final int K_RIGHT = 1 << 3;
            5    public static final int K_FIRE = 1 << 4;
            6    public static final int K_COMMAND_LEFT = 1 << 5;
            7    public static final int K_COMMAND_RIGHT = 1 << 6;
            8    public static final int K_NUM1 = 1 << 7;
            9    public static final int K_NUM2 = 1 << 8;
           10    public static final int K_NUM3 = 1 << 9;
           11    public static final int K_NUM4 = 1 << 10;
           12    public static final int K_NUM5 = 1 << 11;
           13    public static final int K_NUM6 = 1 << 12;
           14    public static final int K_NUM7 = 1 << 13;
           15    public static final int K_NUM8 = 1 << 14;
           16    public static final int K_NUM9 = 1 << 15;
           17    public static final int K_NUM0 = 1 << 16;
           18    public static final int K_POUND = 1 << 17;
           19    public static final int K_STAR = 1 << 18;
           20    public static final int K_C = 1 << 19;
           21    
           22    public static final int COMMAND_UP = K_UP | K_NUM2;
           23    public static final int COMMAND_DOWN = K_DOWN | K_NUM8;
           24    public static final int COMMAND_LEFT = K_LEFT | K_NUM4;
           25    public static final int COMMAND_RIGHT = K_RIGHT | K_NUM6;
           26    public static int COMMAND_OK = K_FIRE | K_NUM5;
           27    public static int COMMAND_BACK = isleft ? K_COMMAND_RIGHT : K_COMMAND_LEFT;
           28    public static int COMMAND_LEFT_OK = isleft ? K_COMMAND_LEFT : K_COMMAND_RIGHT;
           29    
           30    public static int key = 0;
           31    /*============================= keycode ==========================*/
           32    // nokia
           33    public static int UP = -1;
           34    public static int DOWN = -2;
           35    public static int LEFT = -3;
           36    public static int RIGHT = -4;
           37    public static int FIRE = -5;
           38    public static int SOFT_LEFT = -6
           39    public static int SOFT_RIGHT = -7
           40    public static int NUM0 = 48;
           41    public static int NUM1 = 49;
           42    public static int NUM2 = 50;
           43    public static int NUM3 = 51;
           44    public static int NUM4 = 52;
           45    public static int NUM5 = 53;
           46    public static int NUM6 = 54;
           47    public static int NUM7 = 55;
           48    public static int NUM8 = 56;
           49    public static int NUM9 = 57;
           50    public static int POUND = 35;// #
           51    public static int ASTERISK = 42;// *
           52    public static int SEND = -10;// 
           53    public static int END = -11;// 
           54    public static int POWER = -12;
           55    public static int SOFT3 = -20;
           56    public static int CLEAR = -8;// 
           57public static void setKeyState(int keyCode){
           58        
           59        if(keyCode == UP)
           60            
           61            key |= K_UP;
           62        
           63        else if(keyCode == DOWN)
           64            
           65            key |= K_DOWN;
           66        
           67        else if(keyCode == LEFT)
           68            
           69            key |= K_LEFT;
           70        
           71        else if(keyCode == RIGHT)
           72            
           73            key |= K_RIGHT;
           74        
           75        else if(keyCode == FIRE)
           76            
           77            key |= K_FIRE;
           78        
           79        else if(keyCode == SOFT_LEFT)
           80            
           81            key |= K_COMMAND_LEFT;
           82        
           83        else if(keyCode == SOFT_RIGHT)
           84            
           85            key |= K_COMMAND_RIGHT;
           86        
           87        else if(keyCode == NUM0)
           88            
           89            key |= K_NUM0;
           90        
           91        else if(keyCode == NUM1)
           92            
           93            key |= K_NUM1;
           94        
           95        else if(keyCode == NUM2)
           96            
           97            key |= K_NUM2;
           98        
           99        else if(keyCode == NUM3)
          100            
          101            key |= K_NUM3;
          102        
          103        else if(keyCode == NUM4)
          104            
          105            key |= K_NUM4;
          106        
          107        else if(keyCode == NUM5)
          108            
          109            key |= K_NUM5;
          110        
          111        else if(keyCode == NUM6)
          112            
          113            key |= K_NUM6;
          114        
          115        else if(keyCode == NUM7)
          116            
          117            key |= K_NUM7;
          118        
          119        else if(keyCode == NUM8)
          120            
          121            key |= K_NUM8;
          122        
          123        else if(keyCode == NUM9)
          124            
          125            key |= K_NUM9;
          126        
          127        else if(keyCode == POUND)
          128            
          129            key |= K_POUND;
          130        
          131        else if(keyCode == ASTERISK)
          132            
          133            key |= K_STAR;
          134        
          135        if(doublePressedTimer < DOUBLE_PRESSED_TIMER 
          136                && lastDoublePressedKey == keyCode){
          137            
          138            doublePressed = true;
          139            
          140        }
          else{
          141            
          142            doublePressed = false;
          143            
          144        }

          145        
          146    }

          147    
          148    public static void clearAllKeyState(){
          149        
          150        key = 0;
          151        
          152    }

          153    
          154    public static void clearKeyState(int keyCode){
          155        
          156        if(keyCode == UP)
          157            
          158            key  &= (K_UP ^ 0xffffffff);
          159        
          160        else if(keyCode == DOWN)
          161            
          162            key  &= (K_DOWN ^ 0xffffffff);
          163        
          164        else if(keyCode == LEFT)
          165            
          166            key  &= (K_LEFT ^ 0xffffffff);
          167        
          168        else if(keyCode == RIGHT)
          169            
          170            key  &= (K_RIGHT ^ 0xffffffff);
          171        
          172        else if(keyCode == FIRE)
          173            
          174            key  &= (K_FIRE ^ 0xffffffff);
          175        
          176        else if(keyCode == SOFT_LEFT)
          177            
          178            key  &= (K_COMMAND_LEFT ^ 0xffffffff);
          179        
          180        else if(keyCode == SOFT_RIGHT)
          181            
          182            key  &= (K_COMMAND_RIGHT ^ 0xffffffff);
          183        
          184        else if(keyCode == NUM0)
          185            
          186            key  &= (K_NUM0 ^ 0xffffffff);
          187        
          188        else if(keyCode == NUM1)
          189            
          190            key  &= (K_NUM1 ^ 0xffffffff);
          191        
          192        else if(keyCode == NUM2)
          193            
          194            key  &= (K_NUM2 ^ 0xffffffff);
          195        
          196        else if(keyCode == NUM3)
          197            
          198            key  &= (K_NUM3 ^ 0xffffffff);
          199        
          200        else if(keyCode == NUM4)
          201            
          202            key  &= (K_NUM4 ^ 0xffffffff);
          203        
          204        else if(keyCode == NUM5)
          205            
          206            key  &= (K_NUM5 ^ 0xffffffff);
          207        
          208        else if(keyCode == NUM6)
          209            
          210            key  &= (K_NUM6 ^ 0xffffffff);
          211        
          212        else if(keyCode == NUM7)
          213            
          214            key  &= (K_NUM7 ^ 0xffffffff);
          215        
          216        else if(keyCode == NUM8)
          217            
          218            key  &= (K_NUM8 ^ 0xffffffff);
          219        
          220        else if(keyCode == NUM9)
          221            
          222            key  &= (K_NUM9 ^ 0xffffffff);
          223        
          224        else if(keyCode == POUND)
          225            
          226            key  &= (K_POUND ^ 0xffffffff);
          227        
          228        else if(keyCode == ASTERISK)
          229            
          230            key  &= (K_STAR ^ 0xffffffff);
          231        
          232        lastDoublePressedKey = keyCode;
          233        
          234        doublePressedTimer = 0;
          235        
          236    }

          237    
          238    public static boolean getKeyState(int command){
          239        
          240        return (key & command) != 0;
          241        
          242    }

          243    
          244    public static boolean getKeyStateOnce(int command){
          245        
          246        boolean tmp = (key & command) != 0;
          247        
          248        if(tmp) clearAllKeyState();
          249        
          250            return tmp;
          251    }

          252    
          253    public static boolean haveKeyPressedEvent(){
          254        
          255        return key != 0;
          256        
          257    }

          258    
          259    /**
          260     * 雙擊方向鍵上
          261     * @return
          262     */

          263    public static boolean doubleCommandUp(){
          264        
          265        return getKeyState(COMMAND_UP) && doublePressed;
          266        
          267    }

          268    
          269    /**
          270     * 雙擊方向鍵下
          271     * @return
          272     */

          273    public static boolean doubleCommandDown(){
          274        
          275        return getKeyState(COMMAND_DOWN) && doublePressed;
          276        
          277    }

          278    
          279    /**
          280     * 雙擊方向鍵左
          281     * @return
          282     */

          283    public static boolean doubleCommandLeft(){
          284        
          285        return getKeyState(COMMAND_LEFT) && doublePressed;
          286        
          287    }

          288    
          289    /**
          290     * 雙擊方向鍵右
          291     * @return
          292     */

          293    public static boolean doubleCommandRight(){
          294        
          295        return getKeyState(COMMAND_RIGHT) && doublePressed;
          296        
          297    }

          298    
          299    /**
          300     * 雙擊方向鍵確定
          301     * @return
          302     */

          303    public static boolean doubleCommandOK(){
          304        
          305        return getKeyState(COMMAND_OK) && doublePressed;
          306        
          307    }

          308    
          309    /**
          310     * 按下方向鍵上
          311     * @return
          312     */

          313    public static boolean commandUp(){
          314        
          315        return getKeyState(COMMAND_UP);
          316        
          317    }

          318    
          319    /**
          320     * 按下方向鍵下
          321     * @return
          322     */

          323    public static boolean commandDown(){
          324        
          325        return getKeyState(COMMAND_DOWN);
          326        
          327    }

          328    
          329    /**
          330     * 按下方向鍵左
          331     * @return
          332     */

          333    public static boolean commandLeft(){
          334        
          335        return getKeyState(COMMAND_LEFT);
          336        
          337    }

          338    
          339    /**
          340     * 按下方向鍵右
          341     * @return
          342     */

          343    public static boolean commandRight(){
          344        
          345        return getKeyState(COMMAND_RIGHT);
          346        
          347    }

          348    
          349    /**
          350     * 按下方向鍵確定
          351     * @return
          352     */

          353    public static boolean commandOK(){
          354        
          355        return getKeyState(COMMAND_OK);
          356        
          357    }

          358    
          359    /**
          360     * 按下確定軟鍵
          361     * @return
          362     */

          363    public static boolean commandLeftOk(){
          364        
          365        return getKeyState(COMMAND_LEFT_OK);
          366        
          367    }

          368    
          369    /**
          370     * 按下取消軟鍵
          371     * @return
          372     */

          373    public static boolean commandBack(){
          374        
          375        return getKeyState(COMMAND_BACK);
          376        
          377    }

          378    
          379    /**
          380     * 單擊方向鍵上一次
          381     * @return
          382     */

          383    public static boolean commandUpOnce(){
          384        
          385        boolean r = commandUp();
          386        
          387        if(r)
          388            
          389            clearAllKeyState();
          390        
          391        return r;
          392        
          393    }

          394    
          395    /**
          396     * 單擊方向鍵下一次
          397     * @return
          398     */

          399    public static boolean commandDownOnce(){
          400        
          401        boolean r = commandDown();
          402        
          403        if(r)
          404            
          405            clearAllKeyState();
          406        
          407        return r;
          408        
          409    }

          410    
          411    /**
          412     * 單擊方向鍵左一次
          413     * @return
          414     */

          415    public static boolean commandLeftOnce(){
          416        
          417        boolean r = commandLeft();
          418        
          419        if(r)
          420            
          421            clearAllKeyState();
          422        
          423        return r;
          424        
          425    }

          426    
          427    /**
          428     * 單擊方向鍵右一次
          429     * @return
          430     */

          431    public static boolean commandRightOnce(){
          432        
          433        boolean r = commandRight();
          434        
          435        if(r)
          436            
          437            clearAllKeyState();
          438        
          439        return r;
          440        
          441    }

          442    
          443    /**
          444     * 單擊確定鍵一次
          445     * @return
          446     */

          447    public static boolean commandOkOnce(){
          448        
          449        boolean r = commandOK();
          450        
          451        if(r)
          452            
          453            clearAllKeyState();
          454        
          455        return r;
          456        
          457    }

          458    
          459    /**
          460     * 單擊確定軟鍵一次
          461     * @return
          462     */

          463    public static boolean commandLeftOkOnce(){
          464        
          465        boolean r = commandLeftOk();
          466        
          467        if(r)
          468            
          469            clearAllKeyState();
          470        
          471        return r;
          472        
          473    }

          474    
          475    /**
          476     * 單擊取消軟鍵一次
          477     * @return
          478     */

          479    public static boolean commandBackOnce(){
          480        
          481        boolean r = commandBack();
          482        
          483        if(r)
          484            
          485            clearAllKeyState();
          486        
          487        return r;
          488        
          489    }

          其實就是你想想象一串的01010101010010000每個位都代表一個按鍵 當他是1的時候就是按下了 0就表示沒被按下


          實際應用2:效果Buffer
           1// 比如這里我們定義一些技能效果
           2static final int 
           3SKILL_BUFFER_燃燒 = 1
           4SKILL_BUFFER_眩暈 = 1 << 1,
           5SKILL_BUFFER_攻擊力X2 = 1 << 2
           6SKILL_BUFFER_必閃 = 1 << 3;
           7
           8// 為什么不寫成
           9// SKILL_BUFFER_燃燒 = 1, 
          10// SKILL_BUFFER_眩暈 = 2,
          11// SKILL_BUFFER_攻擊力X2 = 3, 
          12// SKILL_BUFFER_必閃 = 4; 呢?
          13// 因為有可能我身上的效果是很多疊在一起的
          14// 我可能身上又著火又眩暈 
          15// 用位操作就可以實現多狀態buffer的共存
          16
          17public void setBuffer_燃燒(){
          18    buffer |= SKILL_BUFFER_燃燒;
          19}

          20
          21public void clearBuffer_燃燒(){
          22
          23}

          24
          25public boolean isBuffer_燃燒(){
          26    return (buffer & SKILL_BUFFER_燃燒) != 0;
          27}



          實際應用3:整型保存數據
          在實際開發的時候,有時候我們想把多個數字保存在一個int里面,那么可以這樣
           1/**
           2     * 將一個數保存在整數里
           3     * @param src 原始數據
           4     * @param num 要保存的數據
           5     * @param begin  從第幾位開始寫
           6     * @return
           7     */

           8    public static int setBit(int src, int num, int begin){
           9        return src | (num << begin);
          10    }

          11    
          12    /**
          13     * 得到一個整數的某幾位
          14     * @param src 原數據
          15     * @param begin 從第幾位開始獲取
          16     * @param len 獲取長度多少位
          17     * @return
          18     */

          19    public static int getBit(int src, int begin, int len){
          20        return (src & getDec(begin, len)) >> begin;
          21    }

          22    
          23    private static int getDec(int begin, int len){
          24        int k = 0;
          25        for(int i = 0; i < len; ++i){
          26            k |= (1 << i);
          27        }

          28        return k << begin;
          29    }

          這個在實際開發中是常用的,比如我的地圖數據,其圖塊編號也就0~100多那么我可以把多層的同一個格子的數據寫到一個int里面
          注意不要存負數就可以了,因為負數前面可有一位符號位哦
          想起來曾經剛使用位的時候總是出錯 給我的驚喜就像剛寫C++時控制臺上滿滿的燙燙燙一樣~


          夏天的確很燙


          posted on 2010-07-04 12:52 colonleado 閱讀(1730) 評論(3)  編輯  收藏 所屬分類: J2me

          評論

          # re: 位操作在實際開發中的應用 2010-07-04 15:55 nmb

          你得解釋一下為什么要這么做吧.
          比如1 << 1 ,1 << 2
          COMMAND_UP = K_UP | K_NUM2;
          可以達到想要的效果
          也就是說他的規律是什么?
            回復  更多評論    

          # re: 位操作在實際開發中的應用 2010-07-05 10:30 colonleado

          @nmb
          比如我們第一位的狀態(0或1)表示方向鍵上是否被按下
          第八位的狀態表示數字鍵2是否被按下
          COMMAND_UP就是方向鍵上和數字鍵2的組合按鍵
          所有COMMAND開頭的都是組合按鍵
          COMMAND_UP就是通過檢測它不論你按下了方向鍵上還是數字鍵2都會返回你按了上
            回復  更多評論    

          # re: 位操作在實際開發中的應用 2010-07-05 18:39 Jie

          感覺講解的不清楚,比如:
          為什么不寫成
          SKILL_BUFFER_燃燒 = 1,
          SKILL_BUFFER_眩暈 = 2,
          SKILL_BUFFER_攻擊力X2 = 3,
          SKILL_BUFFER_必閃 = 4; 呢?
          因為有可能我身上的效果是很多疊在一起的
          我可能身上又著火又眩暈
          用位操作就可以實現多狀態buffer的共存

          共存?咋樣共存?我看完文章后的感覺是位操作就是為了提高代碼的可閱讀性
            回復  更多評論    
          主站蜘蛛池模板: 涡阳县| 焉耆| 准格尔旗| 化德县| 保山市| 柞水县| 大英县| 鄯善县| 仲巴县| 张家界市| 浙江省| 和顺县| 商南县| 永兴县| 宁安市| 泾阳县| 左云县| 吐鲁番市| 阜南县| 泾川县| 辽宁省| 谷城县| 南溪县| 玉树县| 静乐县| 惠安县| 扶沟县| 清水县| 左云县| 冀州市| 北票市| 房山区| 乐清市| 鄂托克前旗| 宁远县| 鄂伦春自治旗| 永泰县| 宣化县| 宝鸡市| 龙游县| 保亭|