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入门到精通教程
查看: 614|回复: 0

位操作在实际开发中的应用

[复制链接]

该用户从未签到

发表于 2011-9-12 23:31:09 | 显示全部楼层 |阅读模式
[blockquote]/*300*250,创建于2011-2-24*/ var cpro_id = 'u388789';
-
[/blockquote]
位操作就是将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里面
注意不要存负数就可以了,因为负数前面可有一位符号位哦
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 09:51 , Processed in 0.420438 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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