Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 289|回复: 0

[J2ME学习]位运算在J2ME中的应用

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 03:00:51 | 显示全部楼层 |阅读模式
    1. 位操作就是将10进制数想为“01010000111”这样的2进制形式去运算、操作 常用运算符有|&<<>>^等
    2. 在C++的开发里一般是不推荐使用位操作的,因为会降低代码的可读性。而且J2me开发中因为内存、运算速度等诸多原因,
    3. 所以推荐使用位操作。
    4. 实际应用1:按键处理
    5. 首先在我们的主Canvas里要调用
    6. /** *//**
    7.       * 键盘接收
    8.       */
    9.      protected void keyPressed(int keyCode) {
    10.          
    11.          CType.setKeyState(keyCode);
    12.          
    13.      }

    14.     /** *//**
    15.      * 键盘放开处理
    16.      */
    17.     protected void keyReleased(int keyCode) {
    18.         
    19.         CType.clearKeyState(keyCode);
    20.         
    21.     }
    22. 然后在我的CType里面:
    23.   public static final int K_UP = 1;
    24.       public static final int K_DOWN = 1 << 1;
    25.       public static final int K_LEFT = 1 << 2;
    26.       public static final int K_RIGHT = 1 << 3;
    27.       public static final int K_FIRE = 1 << 4;
    28.       public static final int K_COMMAND_LEFT = 1 << 5;
    29.       public static final int K_COMMAND_RIGHT = 1 << 6;
    30.       public static final int K_NUM1 = 1 << 7;
    31.       public static final int K_NUM2 = 1 << 8;
    32.      public static final int K_NUM3 = 1 << 9;
    33.      public static final int K_NUM4 = 1 << 10;
    34.      public static final int K_NUM5 = 1 << 11;
    35.      public static final int K_NUM6 = 1 << 12;
    36.      public static final int K_NUM7 = 1 << 13;
    37.      public static final int K_NUM8 = 1 << 14;
    38.      public static final int K_NUM9 = 1 << 15;
    39.      public static final int K_NUM0 = 1 << 16;
    40.      public static final int K_POUND = 1 << 17;
    41.      public static final int K_STAR = 1 << 18;
    42.      public static final int K_C = 1 << 19;
    43.      
    44.      public static final int COMMAND_UP = K_UP | K_NUM2;
    45.      public static final int COMMAND_DOWN = K_DOWN | K_NUM8;
    46.      public static final int COMMAND_LEFT = K_LEFT | K_NUM4;
    47.      public static final int COMMAND_RIGHT = K_RIGHT | K_NUM6;
    48.      public static int COMMAND_OK = K_FIRE | K_NUM5;
    49.      public static int COMMAND_BACK = isleft ? K_COMMAND_RIGHT : K_COMMAND_LEFT;
    50.      public static int COMMAND_LEFT_OK = isleft ? K_COMMAND_LEFT : K_COMMAND_RIGHT;
    51.      
    52.      public static int key = 0;
    53.      /**//*============================= keycode ==========================*/
    54.      // nokia
    55.     public static int UP = -1;
    56.      public static int DOWN = -2;
    57.      public static int LEFT = -3;
    58.      public static int RIGHT = -4;
    59.      public static int FIRE = -5;
    60.      public static int SOFT_LEFT = -6;
    61.      public static int SOFT_RIGHT = -7;
    62.      public static int NUM0 = 48;
    63.      public static int NUM1 = 49;
    64.      public static int NUM2 = 50;
    65.      public static int NUM3 = 51;
    66.      public static int NUM4 = 52;
    67.      public static int NUM5 = 53;
    68.      public static int NUM6 = 54;
    69.      public static int NUM7 = 55;
    70.      public static int NUM8 = 56;
    71.      public static int NUM9 = 57;
    72.      public static int POUND = 35;// #
    73.      public static int ASTERISK = 42;// *
    74.      public static int SEND = -10;//
    75.      public static int END = -11;//
    76.      public static int POWER = -12;
    77.      public static int SOFT3 = -20;
    78.      public static int CLEAR = -8;//
    79.      public static void setKeyState(int keyCode){
    80.          
    81.          if(keyCode == UP)         
    82.              key |= K_UP;
    83.          else if(keyCode == DOWN)
    84.             
    85.              key |= K_DOWN;      
    86.          else if(keyCode == LEFT)            
    87.              key |= K_LEFT;
    88.          else if(keyCode == RIGHT)
    89.             
    90.              key |= K_RIGHT;
    91.          else if(keyCode == FIRE)
    92.             
    93.              key |= K_FIRE;
    94.          
    95.          else if(keyCode == SOFT_LEFT)
    96.             
    97.             key |= K_COMMAND_LEFT;
    98.          
    99.          else if(keyCode == SOFT_RIGHT)
    100.             
    101.            key |= K_COMMAND_RIGHT;
    102.          
    103.          else if(keyCode == NUM0)
    104.             
    105.              key |= K_NUM0;
    106.          
    107.          else if(keyCode == NUM1)
    108.             
    109.              key |= K_NUM1;
    110.          
    111.          else if(keyCode == NUM2)
    112.             
    113.              key |= K_NUM2;
    114.          
    115.          else if(keyCode == NUM3)
    116.             
    117.             key |= K_NUM3;
    118.         
    119.        else if(keyCode == NUM4)
    120.             
    121.             key |= K_NUM4;
    122.         
    123.         else if(keyCode == NUM5)
    124.             
    125.             key |= K_NUM5;
    126.         
    127.         else if(keyCode == NUM6)
    128.             
    129.             key |= K_NUM6;
    130.         
    131.         else if(keyCode == NUM7)
    132.             
    133.             key |= K_NUM7;
    134.         
    135.         else if(keyCode == NUM8)
    136.             
    137.            key |= K_NUM8;
    138.         
    139.         else if(keyCode == NUM9)
    140.             
    141.             key |= K_NUM9;
    142.         
    143.         else if(keyCode == POUND)
    144.             
    145.             key |= K_POUND;
    146.         
    147.         else if(keyCode == ASTERISK)
    148.             
    149.             key |= K_STAR;
    150.         
    151.         if(doublePressedTimer < DOUBLE_PRESSED_TIMER
    152.                && lastDoublePressedKey == keyCode){
    153.             
    154.             doublePressed = true;
    155.             
    156.         }else{
    157.             
    158.             doublePressed = false;
    159.             
    160.         }
    161.         
    162.     }
    163.    
    164.    public static void clearAllKeyState(){      
    165.         key = 0;
    166.         
    167.     }
    168.    
    169.     public static void clearKeyState(int keyCode){      
    170.         if(keyCode == UP)      
    171.             key  &= (K_UP ^ 0xffffffff);
    172.         
    173.         else if(keyCode == DOWN)
    174.             
    175.             key  &= (K_DOWN ^ 0xffffffff);
    176.         
    177.         else if(keyCode == LEFT)
    178.             
    179.             key  &= (K_LEFT ^ 0xffffffff);
    180.         
    181.         else if(keyCode == RIGHT)
    182.             
    183.             key  &= (K_RIGHT ^ 0xffffffff);
    184.         
    185.        else if(keyCode == FIRE)
    186.             
    187.             key  &= (K_FIRE ^ 0xffffffff);
    188.         
    189.         else if(keyCode == SOFT_LEFT)
    190.             
    191.            key  &= (K_COMMAND_LEFT ^ 0xffffffff);
    192.         
    193.         else if(keyCode == SOFT_RIGHT)
    194.             
    195.             key  &= (K_COMMAND_RIGHT ^ 0xffffffff);
    196.         
    197.         else if(keyCode == NUM0)
    198.             
    199.             key  &= (K_NUM0 ^ 0xffffffff);
    200.         
    201.         else if(keyCode == NUM1)
    202.             
    203.             key  &= (K_NUM1 ^ 0xffffffff);
    204.         
    205.         else if(keyCode == NUM2)
    206.             
    207.             key  &= (K_NUM2 ^ 0xffffffff);
    208.       
    209.         else if(keyCode == NUM3)
    210.             
    211.             key  &= (K_NUM3 ^ 0xffffffff);
    212.       
    213.         else if(keyCode == NUM4)
    214.             
    215.             key  &= (K_NUM4 ^ 0xffffffff);
    216.         
    217.         else if(keyCode == NUM5)
    218.             
    219.            key  &= (K_NUM5 ^ 0xffffffff);
    220.         
    221.         else if(keyCode == NUM6)
    222.             
    223.             key  &= (K_NUM6 ^ 0xffffffff);
    224.         
    225.         else if(keyCode == NUM7)
    226.             
    227.             key  &= (K_NUM7 ^ 0xffffffff);
    228.         
    229.         else if(keyCode == NUM8)
    230.             
    231.             key  &= (K_NUM8 ^ 0xffffffff);
    232.         
    233.         else if(keyCode == NUM9)
    234.             
    235.             key  &= (K_NUM9 ^ 0xffffffff);
    236.         
    237.         else if(keyCode == POUND)
    238.             
    239.             key  &= (K_POUND ^ 0xffffffff);
    240.       
    241.         else if(keyCode == ASTERISK)
    242.             
    243.             key  &= (K_STAR ^ 0xffffffff);
    244.         
    245.         lastDoublePressedKey = keyCode;
    246.       
    247.         doublePressedTimer = 0;
    248.       
    249.     }
    250.    
    251.     public static boolean getKeyState(int command){
    252.         
    253.         return (key & command) != 0;
    254.         
    255.     }
    256.    
    257.     public static boolean getKeyStateOnce(int command){
    258.         
    259.         boolean tmp = (key & command) != 0;
    260.         
    261.         if(tmp) clearAllKeyState();
    262.         
    263.             return tmp;
    264.     }
    265.    
    266.     public static boolean haveKeyPressedEvent(){
    267.         
    268.         return key != 0;
    269.         
    270.     }
    271.    
    272.     /** *//**
    273.      * 双击方向键上
    274.      * @return
    275.      */
    276.     public static boolean doubleCommandUp(){
    277.         
    278.         return getKeyState(COMMAND_UP) && doublePressed;
    279.       
    280.     }
    281.    
    282.    /** *//**
    283.      * 双击方向键下
    284.      * @return
    285.      */
    286.     public static boolean doubleCommandDown(){
    287.       
    288.         return getKeyState(COMMAND_DOWN) && doublePressed;
    289.       
    290.     }
    291.    
    292.     /** *//**
    293.      * 双击方向键左
    294.      * @return
    295.      */
    296.     public static boolean doubleCommandLeft(){
    297.         
    298.         return getKeyState(COMMAND_LEFT) && doublePressed;
    299.         
    300.     }
    301.    
    302.     /** *//**
    303.      * 双击方向键右
    304.      * @return
    305.      */
    306.     public static boolean doubleCommandRight(){
    307.         
    308.         return getKeyState(COMMAND_RIGHT) && doublePressed;
    309.         
    310.     }
    311.    
    312.    /** *//**
    313.      * 双击方向键确定
    314.      * @return
    315.      */
    316.     public static boolean doubleCommandOK(){
    317.       
    318.         return getKeyState(COMMAND_OK) && doublePressed;
    319.         
    320.     }
    321.    
    322.     /** *//**
    323.      * 按下方向键上
    324.      * @return
    325.      */
    326.     public static boolean commandUp(){
    327.         
    328.         return getKeyState(COMMAND_UP);
    329.         
    330.     }
    331.    
    332.     /** *//**
    333.      * 按下方向键下
    334.      * @return
    335.      */
    336.     public static boolean commandDown(){
    337.         
    338.         return getKeyState(COMMAND_DOWN);
    339.         
    340.     }
    341.    
    342.     /** *//**
    343.      * 按下方向键左
    344.      * @return
    345.      */
    346.     public static boolean commandLeft(){
    347.         
    348.         return getKeyState(COMMAND_LEFT);
    349.         
    350.     }
    351.    
    352.     /** *//**
    353.      * 按下方向键右
    354.      * @return
    355.      */
    356.     public static boolean commandRight(){
    357.         
    358.         return getKeyState(COMMAND_RIGHT);
    359.         
    360.     }
    361.    
    362.     /** *//**
    363.      * 按下方向键确定
    364.      * @return
    365.      */
    366.     public static boolean commandOK(){
    367.         
    368.         return getKeyState(COMMAND_OK);
    369.      
    370.     }
    371.    
    372.     /** *//**
    373.      * 按下确定软键
    374.      * @return
    375.      */
    376.     public static boolean commandLeftOk(){
    377.       
    378.         return getKeyState(COMMAND_LEFT_OK);
    379.       
    380.     }
    381.   
    382.     /** *//**
    383.      * 按下取消软键
    384.      * @return
    385.     */
    386.     public static boolean commandBack(){
    387.         
    388.       return getKeyState(COMMAND_BACK);
    389.         
    390.     }
    391.    
    392.    /** *//**
    393.     * 单击方向键上一次
    394.     * @return
    395.     */
    396.    public static boolean commandUpOnce(){
    397.         
    398.         boolean r = commandUp();
    399.         
    400.         if(r)
    401.             
    402.             clearAllKeyState();
    403.         
    404.         return r;
    405.         
    406.     }
    407.    
    408.     /** *//**
    409.      * 单击方向键下一次
    410.      * @return
    411.      */
    412.     public static boolean commandDownOnce(){
    413.         
    414.         boolean r = commandDown();
    415.         
    416.         if(r)
    417.             
    418.             clearAllKeyState();
    419.         
    420.         return r;
    421.         
    422.     }
    423.    
    424.     /** *//**
    425.      * 单击方向键左一次
    426.      * @return
    427.      */
    428.     public static boolean commandLeftOnce(){
    429.         
    430.         boolean r = commandLeft();
    431.         
    432.         if(r)
    433.             
    434.             clearAllKeyState();
    435.         
    436.         return r;
    437.         
    438.     }

    439.     /** *//**
    440.     * 单击方向键右一次
    441.     * @return
    442.      */
    443.     public static boolean commandRightOnce(){
    444.         
    445.         boolean r = commandRight();
    446.         
    447.         if(r)
    448.             
    449.             clearAllKeyState();
    450.         
    451.        return r;
    452.       
    453.     }
    454.    
    455.     /** *//**
    456.      * 单击确定键一次
    457.      * @return
    458.      */
    459.     public static boolean commandOkOnce(){
    460.         
    461.         boolean r = commandOK();
    462.         
    463.         if(r)
    464.             
    465.             clearAllKeyState();
    466.         
    467.         return r;
    468.         
    469.     }
    470.    
    471.     /** *//**
    472.      * 单击确定软键一次
    473.      * @return
    474.      */
    475.    public static boolean commandLeftOkOnce(){
    476.         
    477.         boolean r = commandLeftOk();
    478.         
    479.         if(r)
    480.             
    481.             clearAllKeyState();
    482.         
    483.         return r;
    484.         
    485.     }
    486.    
    487.     /** *//**
    488.      * 单击取消软键一次
    489.      * @return
    490.     */
    491.     public static boolean commandBackOnce(){
    492.         
    493.         boolean r = commandBack();
    494.         
    495.         if(r)
    496.             
    497.             clearAllKeyState();
    498.         
    499.        return r;
    500.         
    501.     }
    502.   就是一串的01010101010010000每个位都代表一个按键 当他是1的时候就是按下了 0就表示没被按下.
    503. 实际应用2:效果Buffer
    504. // 比如这里我们定义一些技能效果
    505. static final int
    506. SKILL_BUFFER_燃烧 = 1,
    507. SKILL_BUFFER_眩晕 = 1 << 1,
    508. SKILL_BUFFER_攻击力X2 = 1 << 2,
    509. SKILL_BUFFER_必闪 = 1 << 3;
    510. // 为什么不写成
    511. // SKILL_BUFFER_燃烧 = 1,
    512. // SKILL_BUFFER_眩晕 = 2,
    513. // SKILL_BUFFER_攻击力X2 = 3,
    514. // SKILL_BUFFER_必闪 = 4; 呢?
    515. // 因为有可能我身上的效果是很多叠在一起的
    516. // 我可能身上又着火又眩晕
    517. // 用位操作就可以实现多状态buffer的共存
    518. public void setBuffer_燃烧(){
    519.     buffer |= SKILL_BUFFER_燃烧;
    520. }
    521. public void clearBuffer_燃烧(){
    522. }
    523. public boolean isBuffer_燃烧(){
    524.     return (buffer & SKILL_BUFFER_燃烧) != 0;
    525. }
    526. 实际应用3:整型保存数据
    527. 在实际开发的时候,有时候我们想把多个数字保存在一个int里面,那么可以这样
    528. /** *//**
    529.       * 将一个数保存在整数里
    530.       * @param src 原始数据
    531.       * @param num 要保存的数据
    532.       * @param begin  从第几位开始写
    533.       * @return
    534.       */
    535.      public static int setBit(int src, int num, int begin){
    536.          return src | (num << begin);
    537.     }
    538.    
    539.     /** *//**
    540.      * 得到一个整数的某几位
    541.      * @param src 原数据
    542.      * @param begin 从第几位开始获取
    543.      * @param len 获取长度多少位
    544.      * @return
    545.      */
    546.     public static int getBit(int src, int begin, int len){
    547.         return (src & getDec(begin, len)) >> begin;
    548.     }
    549.    
    550.     private static int getDec(int begin, int len){
    551.         int k = 0;
    552.         for(int i = 0; i < len; ++i){
    553.             k |= (1 << i);
    554.        }
    555.         return k << begin;
    556.     }
    557.   这个在实际开发中是常用的,比如我的地图数据,其图块编号也就 0~100多那么我可以把多层的同一个格子的数据写到一个int里面
    558. 注意不要存负数就可以了,因为负数前面可有一位符号位哦.
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-2 16:13 , Processed in 0.402006 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表