<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1726) 評論(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的共存

    共存?咋樣共存?我看完文章后的感覺是位操作就是為了提高代碼的可閱讀性
      回復  更多評論    
    主站蜘蛛池模板: 久久亚洲AV成人无码| 亚洲第一区精品观看| 亚洲成人免费在线观看| 日韩视频在线观看免费| 国产精品免费观看调教网| 美女视频黄的免费视频网页| 搡女人免费免费视频观看| 中文字幕免费不卡二区| 久久大香香蕉国产免费网站| 99蜜桃在线观看免费视频网站| 日本在线看片免费人成视频1000 | 亚洲成AV人片在线观看| 日韩亚洲欧洲在线com91tv| 亚洲AV天天做在线观看| 久久久久亚洲av无码专区喷水| 亚洲第一永久在线观看| 亚洲精品国产精品国自产网站| 亚洲www77777| 日韩在线一区二区三区免费视频 | 久久综合久久综合亚洲| 亚洲国产精品日韩av不卡在线| 337P日本欧洲亚洲大胆精品| 视频免费1区二区三区| 嫩草在线视频www免费看| 蜜桃视频在线观看免费视频网站WWW| 1000部拍拍拍18免费网站| 成人黄动漫画免费网站视频 | 一本色道久久综合亚洲精品高清| 亚洲热线99精品视频| 7777久久亚洲中文字幕蜜桃| wwwxxx亚洲| 一级A毛片免费观看久久精品| 91在线视频免费观看| 亚洲毛片免费视频| 国产又大又粗又硬又长免费| 久久综合亚洲色HEZYO国产| 久久精品国产亚洲AV麻豆网站| 亚洲欧美日韩中文二区| 二级毛片免费观看全程| 伊人久久免费视频| 黄网址在线永久免费观看 |