位操作在實際開發中的應用
位操作就是將10進制數想為“01010000111”這樣的2進制形式去運算、操作 常用運算符有|&<<>>^等
在C++的開發里一般是不推薦使用位操作的,因為會降低代碼的可讀性。而且J2me開發中因為內存、運算速度等諸多原因,所以推薦使用位操作。
實際應用1:按鍵處理
首先在我們的主Canvas里要調用
然后在我的CType里面:
其實就是你想想象一串的01010101010010000每個位都代表一個按鍵 當他是1的時候就是按下了 0就表示沒被按下
實際應用2:效果Buffer
實際應用3:整型保存數據
在實際開發的時候,有時候我們想把多個數字保存在一個int里面,那么可以這樣
這個在實際開發中是常用的,比如我的地圖數據,其圖塊編號也就0~100多那么我可以把多層的同一個格子的數據寫到一個int里面
注意不要存負數就可以了,因為負數前面可有一位符號位哦
想起來曾經剛使用位的時候總是出錯 給我的驚喜就像剛寫C++時控制臺上滿滿的燙燙燙一樣~
夏天的確很燙
在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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

然后在我的CType里面:
1
public 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;//
57
public 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

其實就是你想想象一串的01010101010010000每個位都代表一個按鍵 當他是1的時候就是按下了 0就表示沒被按下
實際應用2:效果Buffer
1
// 比如這里我們定義一些技能效果
2
static final int
3
SKILL_BUFFER_燃燒 = 1,
4
SKILL_BUFFER_眩暈 = 1 << 1,
5
SKILL_BUFFER_攻擊力X2 = 1 << 2,
6
SKILL_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
17
public void setBuffer_燃燒(){
18
buffer |= SKILL_BUFFER_燃燒;
19
}
20
21
public void clearBuffer_燃燒(){
22
23
}
24
25
public boolean isBuffer_燃燒(){
26
return (buffer & SKILL_BUFFER_燃燒) != 0;
27
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

這個在實際開發中是常用的,比如我的地圖數據,其圖塊編號也就0~100多那么我可以把多層的同一個格子的數據寫到一個int里面
注意不要存負數就可以了,因為負數前面可有一位符號位哦
想起來曾經剛使用位的時候總是出錯 給我的驚喜就像剛寫C++時控制臺上滿滿的燙燙燙一樣~
夏天的確很燙
posted on 2010-07-04 12:52 colonleado 閱讀(1730) 評論(3) 編輯 收藏 所屬分類: J2me