TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
- 位操作就是将10进制数想为“01010000111”这样的2进制形式去运算、操作 常用运算符有|&<<>>^等
- 在C++的开发里一般是不推荐使用位操作的,因为会降低代码的可读性。而且J2me开发中因为内存、运算速度等诸多原因,
- 所以推荐使用位操作。
- 实际应用1:按键处理
- 首先在我们的主Canvas里要调用
- /** *//**
- * 键盘接收
- */
- protected void keyPressed(int keyCode) {
-
- CType.setKeyState(keyCode);
-
- }
-
- /** *//**
- * 键盘放开处理
- */
- protected void keyReleased(int keyCode) {
-
- CType.clearKeyState(keyCode);
-
- }
- 然后在我的CType里面:
- public static final int K_UP = 1;
- public static final int K_DOWN = 1 << 1;
- public static final int K_LEFT = 1 << 2;
- public static final int K_RIGHT = 1 << 3;
- public static final int K_FIRE = 1 << 4;
- public static final int K_COMMAND_LEFT = 1 << 5;
- public static final int K_COMMAND_RIGHT = 1 << 6;
- public static final int K_NUM1 = 1 << 7;
- public static final int K_NUM2 = 1 << 8;
- public static final int K_NUM3 = 1 << 9;
- public static final int K_NUM4 = 1 << 10;
- public static final int K_NUM5 = 1 << 11;
- public static final int K_NUM6 = 1 << 12;
- public static final int K_NUM7 = 1 << 13;
- public static final int K_NUM8 = 1 << 14;
- public static final int K_NUM9 = 1 << 15;
- public static final int K_NUM0 = 1 << 16;
- public static final int K_POUND = 1 << 17;
- public static final int K_STAR = 1 << 18;
- public static final int K_C = 1 << 19;
-
- public static final int COMMAND_UP = K_UP | K_NUM2;
- public static final int COMMAND_DOWN = K_DOWN | K_NUM8;
- public static final int COMMAND_LEFT = K_LEFT | K_NUM4;
- public static final int COMMAND_RIGHT = K_RIGHT | K_NUM6;
- public static int COMMAND_OK = K_FIRE | K_NUM5;
- public static int COMMAND_BACK = isleft ? K_COMMAND_RIGHT : K_COMMAND_LEFT;
- public static int COMMAND_LEFT_OK = isleft ? K_COMMAND_LEFT : K_COMMAND_RIGHT;
-
- public static int key = 0;
- /**//*============================= keycode ==========================*/
- // nokia
- public static int UP = -1;
- public static int DOWN = -2;
- public static int LEFT = -3;
- public static int RIGHT = -4;
- public static int FIRE = -5;
- public static int SOFT_LEFT = -6;
- public static int SOFT_RIGHT = -7;
- public static int NUM0 = 48;
- public static int NUM1 = 49;
- public static int NUM2 = 50;
- public static int NUM3 = 51;
- public static int NUM4 = 52;
- public static int NUM5 = 53;
- public static int NUM6 = 54;
- public static int NUM7 = 55;
- public static int NUM8 = 56;
- public static int NUM9 = 57;
- public static int POUND = 35;// #
- public static int ASTERISK = 42;// *
- public static int SEND = -10;//
- public static int END = -11;//
- public static int POWER = -12;
- public static int SOFT3 = -20;
- public static int CLEAR = -8;//
- public static void setKeyState(int keyCode){
-
- if(keyCode == UP)
- key |= K_UP;
- else if(keyCode == DOWN)
-
- key |= K_DOWN;
- else if(keyCode == LEFT)
- key |= K_LEFT;
- else if(keyCode == RIGHT)
-
- key |= K_RIGHT;
- else if(keyCode == FIRE)
-
- key |= K_FIRE;
-
- else if(keyCode == SOFT_LEFT)
-
- key |= K_COMMAND_LEFT;
-
- else if(keyCode == SOFT_RIGHT)
-
- key |= K_COMMAND_RIGHT;
-
- else if(keyCode == NUM0)
-
- key |= K_NUM0;
-
- else if(keyCode == NUM1)
-
- key |= K_NUM1;
-
- else if(keyCode == NUM2)
-
- key |= K_NUM2;
-
- else if(keyCode == NUM3)
-
- key |= K_NUM3;
-
- else if(keyCode == NUM4)
-
- key |= K_NUM4;
-
- else if(keyCode == NUM5)
-
- key |= K_NUM5;
-
- else if(keyCode == NUM6)
-
- key |= K_NUM6;
-
- else if(keyCode == NUM7)
-
- key |= K_NUM7;
-
- else if(keyCode == NUM8)
-
- key |= K_NUM8;
-
- else if(keyCode == NUM9)
-
- key |= K_NUM9;
-
- else if(keyCode == POUND)
-
- key |= K_POUND;
-
- else if(keyCode == ASTERISK)
-
- key |= K_STAR;
-
- if(doublePressedTimer < DOUBLE_PRESSED_TIMER
- && lastDoublePressedKey == keyCode){
-
- doublePressed = true;
-
- }else{
-
- doublePressed = false;
-
- }
-
- }
-
- public static void clearAllKeyState(){
- key = 0;
-
- }
-
- public static void clearKeyState(int keyCode){
- if(keyCode == UP)
- key &= (K_UP ^ 0xffffffff);
-
- else if(keyCode == DOWN)
-
- key &= (K_DOWN ^ 0xffffffff);
-
- else if(keyCode == LEFT)
-
- key &= (K_LEFT ^ 0xffffffff);
-
- else if(keyCode == RIGHT)
-
- key &= (K_RIGHT ^ 0xffffffff);
-
- else if(keyCode == FIRE)
-
- key &= (K_FIRE ^ 0xffffffff);
-
- else if(keyCode == SOFT_LEFT)
-
- key &= (K_COMMAND_LEFT ^ 0xffffffff);
-
- else if(keyCode == SOFT_RIGHT)
-
- key &= (K_COMMAND_RIGHT ^ 0xffffffff);
-
- else if(keyCode == NUM0)
-
- key &= (K_NUM0 ^ 0xffffffff);
-
- else if(keyCode == NUM1)
-
- key &= (K_NUM1 ^ 0xffffffff);
-
- else if(keyCode == NUM2)
-
- key &= (K_NUM2 ^ 0xffffffff);
-
- else if(keyCode == NUM3)
-
- key &= (K_NUM3 ^ 0xffffffff);
-
- else if(keyCode == NUM4)
-
- key &= (K_NUM4 ^ 0xffffffff);
-
- else if(keyCode == NUM5)
-
- key &= (K_NUM5 ^ 0xffffffff);
-
- else if(keyCode == NUM6)
-
- key &= (K_NUM6 ^ 0xffffffff);
-
- else if(keyCode == NUM7)
-
- key &= (K_NUM7 ^ 0xffffffff);
-
- else if(keyCode == NUM8)
-
- key &= (K_NUM8 ^ 0xffffffff);
-
- else if(keyCode == NUM9)
-
- key &= (K_NUM9 ^ 0xffffffff);
-
- else if(keyCode == POUND)
-
- key &= (K_POUND ^ 0xffffffff);
-
- else if(keyCode == ASTERISK)
-
- key &= (K_STAR ^ 0xffffffff);
-
- lastDoublePressedKey = keyCode;
-
- doublePressedTimer = 0;
-
- }
-
- public static boolean getKeyState(int command){
-
- return (key & command) != 0;
-
- }
-
- public static boolean getKeyStateOnce(int command){
-
- boolean tmp = (key & command) != 0;
-
- if(tmp) clearAllKeyState();
-
- return tmp;
- }
-
- public static boolean haveKeyPressedEvent(){
-
- return key != 0;
-
- }
-
- /** *//**
- * 双击方向键上
- * @return
- */
- public static boolean doubleCommandUp(){
-
- return getKeyState(COMMAND_UP) && doublePressed;
-
- }
-
- /** *//**
- * 双击方向键下
- * @return
- */
- public static boolean doubleCommandDown(){
-
- return getKeyState(COMMAND_DOWN) && doublePressed;
-
- }
-
- /** *//**
- * 双击方向键左
- * @return
- */
- public static boolean doubleCommandLeft(){
-
- return getKeyState(COMMAND_LEFT) && doublePressed;
-
- }
-
- /** *//**
- * 双击方向键右
- * @return
- */
- public static boolean doubleCommandRight(){
-
- return getKeyState(COMMAND_RIGHT) && doublePressed;
-
- }
-
- /** *//**
- * 双击方向键确定
- * @return
- */
- public static boolean doubleCommandOK(){
-
- return getKeyState(COMMAND_OK) && doublePressed;
-
- }
-
- /** *//**
- * 按下方向键上
- * @return
- */
- public static boolean commandUp(){
-
- return getKeyState(COMMAND_UP);
-
- }
-
- /** *//**
- * 按下方向键下
- * @return
- */
- public static boolean commandDown(){
-
- return getKeyState(COMMAND_DOWN);
-
- }
-
- /** *//**
- * 按下方向键左
- * @return
- */
- public static boolean commandLeft(){
-
- return getKeyState(COMMAND_LEFT);
-
- }
-
- /** *//**
- * 按下方向键右
- * @return
- */
- public static boolean commandRight(){
-
- return getKeyState(COMMAND_RIGHT);
-
- }
-
- /** *//**
- * 按下方向键确定
- * @return
- */
- public static boolean commandOK(){
-
- return getKeyState(COMMAND_OK);
-
- }
-
- /** *//**
- * 按下确定软键
- * @return
- */
- public static boolean commandLeftOk(){
-
- return getKeyState(COMMAND_LEFT_OK);
-
- }
-
- /** *//**
- * 按下取消软键
- * @return
- */
- public static boolean commandBack(){
-
- return getKeyState(COMMAND_BACK);
-
- }
-
- /** *//**
- * 单击方向键上一次
- * @return
- */
- public static boolean commandUpOnce(){
-
- boolean r = commandUp();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
-
- /** *//**
- * 单击方向键下一次
- * @return
- */
- public static boolean commandDownOnce(){
-
- boolean r = commandDown();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
-
- /** *//**
- * 单击方向键左一次
- * @return
- */
- public static boolean commandLeftOnce(){
-
- boolean r = commandLeft();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
-
- /** *//**
- * 单击方向键右一次
- * @return
- */
- public static boolean commandRightOnce(){
-
- boolean r = commandRight();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
-
- /** *//**
- * 单击确定键一次
- * @return
- */
- public static boolean commandOkOnce(){
-
- boolean r = commandOK();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
-
- /** *//**
- * 单击确定软键一次
- * @return
- */
- public static boolean commandLeftOkOnce(){
-
- boolean r = commandLeftOk();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
-
- /** *//**
- * 单击取消软键一次
- * @return
- */
- public static boolean commandBackOnce(){
-
- boolean r = commandBack();
-
- if(r)
-
- clearAllKeyState();
-
- return r;
-
- }
- 就是一串的01010101010010000每个位都代表一个按键 当他是1的时候就是按下了 0就表示没被按下.
- 实际应用2:效果Buffer
- // 比如这里我们定义一些技能效果
- static final int
- SKILL_BUFFER_燃烧 = 1,
- SKILL_BUFFER_眩晕 = 1 << 1,
- SKILL_BUFFER_攻击力X2 = 1 << 2,
- SKILL_BUFFER_必闪 = 1 << 3;
- // 为什么不写成
- // SKILL_BUFFER_燃烧 = 1,
- // SKILL_BUFFER_眩晕 = 2,
- // SKILL_BUFFER_攻击力X2 = 3,
- // SKILL_BUFFER_必闪 = 4; 呢?
- // 因为有可能我身上的效果是很多叠在一起的
- // 我可能身上又着火又眩晕
- // 用位操作就可以实现多状态buffer的共存
- public void setBuffer_燃烧(){
- buffer |= SKILL_BUFFER_燃烧;
- }
- public void clearBuffer_燃烧(){
- }
- public boolean isBuffer_燃烧(){
- return (buffer & SKILL_BUFFER_燃烧) != 0;
- }
- 实际应用3:整型保存数据
- 在实际开发的时候,有时候我们想把多个数字保存在一个int里面,那么可以这样
- /** *//**
- * 将一个数保存在整数里
- * @param src 原始数据
- * @param num 要保存的数据
- * @param begin 从第几位开始写
- * @return
- */
- public static int setBit(int src, int num, int begin){
- return src | (num << begin);
- }
-
- /** *//**
- * 得到一个整数的某几位
- * @param src 原数据
- * @param begin 从第几位开始获取
- * @param len 获取长度多少位
- * @return
- */
- public static int getBit(int src, int begin, int len){
- return (src & getDec(begin, len)) >> begin;
- }
-
- private static int getDec(int begin, int len){
- int k = 0;
- for(int i = 0; i < len; ++i){
- k |= (1 << i);
- }
- return k << begin;
- }
- 这个在实际开发中是常用的,比如我的地图数据,其图块编号也就 0~100多那么我可以把多层的同一个格子的数据写到一个int里面
- 注意不要存负数就可以了,因为负数前面可有一位符号位哦.
复制代码 |
|