﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-饶荣庆 -- 3geye.net</title><link>http://www.blogjava.net/gooogle/</link><description> &lt;a href="http://www.3geye.net"&gt;&lt;color ="0xFFFFFF"&gt;3G 手机开发网&lt;/color&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 17 May 2008 20:07:20 GMT</lastBuildDate><pubDate>Sat, 17 May 2008 20:07:20 GMT</pubDate><ttl>60</ttl><item><title>再次复习 ： 运算符和表达式 </title><link>http://www.blogjava.net/gooogle/archive/2008/04/17/193654.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Thu, 17 Apr 2008 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/17/193654.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/193654.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/17/193654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/193654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/193654.html</trackback:ping><description><![CDATA[<p>出自 <a href="http://www.3geye.net/?3/viewspace-3425" target="_blank">http://www.3geye.net/?3/viewspace-3425</a></p>
<p><br />
</p>
<p><a href="http://www.3geye.net/?3/viewspace-3425" target="_blank"><strong><span style="font-size: x-small;">
<pre>这里排版不好可以到原文查看</pre>
</span></strong></a></p>
<p>运 算 符 指 明 对 操 作 数 所 进 行 的 运 算 。 按 操 作 数 的 数 目 来 分 ,可 以 有 一 元 运 算 符 (如 ++、<br />
<br />
-),二 元 运 算 符 (如 +、 ＞)和 三 元 运 算 符 (如 ?:),它 们 分 别 对 应 于 一 个 、 两 个 和 三 个 操 作 数 。 对<br />
<br />
于 一 元 运 算 符 来 说 ,可 以 有 前 缀 表 达 式 (如 ++i )和 后 缀 表 达 式 (如 i++),对 于 二 元 运 算 符 来 说 则<br />
<br />
采 用 中 缀 表 达 式 (如 a+b)。 按 照 运 算 符 功 能 来 分 ,基 本 的 运 算 符 有 下 面 几 类 :<br />
<br />
1.算 术 运 算 符 (+,-,*,/,%,++,--)<br />
<br />
2.关 系 运 算 符 (＞,＜,＞=,＜=,==,!=)<br />
<br />
3.布 尔 逻 辑 运 算 符 (!,&amp;&amp;,||)<br />
<br />
4.位 运 算 符 (＞＞,＜＜,＞＞＞,&amp;,|,^,～ )<br />
<br />
5.赋 值 运 算 符 (=,及 其 扩 展 赋 值 运 算 符 如 +=)<br />
<br />
6.条 件 运 算 符 ( ?:)<br />
<br />
7.其 它 (包 括 分 量 运 算 符 ? ,下 标 运 算 符 [],实 例 运 算 符 instanc eof,内 存 分 配 运 算 符 new,强 制 类<br />
<br />
型 转 换 运 算 符 (类 型 ),方 法 调 用 运 算 符 () 等 )<br />
<br />
本 章 中 我 们 主 要 讲 述 前 6类 运 算 符 。<br />
<br />
&#167; 3.1算 术 运 算 符<br />
<br />
算 术 运 算 符 作 用 于 整 型 或 浮 点 型 数 据 ,完 成 算 术 运 算 。<br />
<br />
一 、 二 元 算 术 运 算 符 ,如 下 表 所 示<br />
<br />
运算符 用法 描述<br />
<br />
+ op1+op2 加<br />
<br />
- op1-op2 减<br />
<br />
* op1*op2 乘<br />
<br />
/ op1/op2 除<br />
<br />
% op1%op2 取模(求余)<br />
<br />
Java对 加 运 算 符 进 行 了 扩 展 ,使 它 能 够 进 行 字 符 串 的 连 接 ,如 "abc"+"de",得 到 串 "abcde"。 我<br />
<br />
们 将 在 第 七 章 中 讲 解 。<br />
<br />
与 C、 C++不 同 ,对 取 模 运 算 符 %来 说 ,其 操 作 数 可 以 为 浮 点 数 , 如 37.2%10=7.2。<br />
<br />
二 、 一 元 算 术 运 算 符 ,如 下 表 所 示 :<br />
<br />
运算符 用法 描述<br />
<br />
+ +op 正值<br />
<br />
- -op 负值<br />
<br />
++ ++op,op++ 加1<br />
<br />
-- --op,op-- 减1<br />
<br />
i++与 ++i的 区 别<br />
<br />
i++在 使 用 i之 后 ,使 i的 值 加 1,因 此 执 行 完 i++后 ,整 个 表 达 式 的 值 为 i,而 i的 值 变 为 i+1。<br />
<br />
++i在 使 用 i之 前 ,使 i的 值 加 1,因 此 执 行 完 ++i后 ,整 个 表 达 式 和 i的 值 均 为 i+1。<br />
<br />
对 i--与 --i同 样 。<br />
<br />
例 3.1.下 面 的 例 子 说 明 了 算 术 运 算 符 的 使 用<br />
<br />
public class ArithmaticOp{<br />
<br />
public static void main( String args[] ){<br />
<br />
int a=5+4; //a=9<br />
<br />
int b=a*2; //b=18<br />
<br />
int c=b/4; //c=4<br />
<br />
int d=b-c; //d=14<br />
<br />
int e=-d; //e=-14<br />
<br />
int f=e%4; //f=-2<br />
<br />
double g=18.4;<br />
<br />
double h=g%4; //h=2.4<br />
<br />
int i=3;<br />
<br />
int j=i++; //i=4,j=3<br />
<br />
int k=++i; //i=5,k=5<br />
<br />
System.out.println("a = "+a);<br />
<br />
System.out.println("b = "+b);<br />
<br />
System.out.println("c = "+c);<br />
<br />
System.out.println("d = "+d);<br />
<br />
System.out.println("e = "+e);<br />
<br />
System.out.println("f = "+f);<br />
<br />
System.out.println("g = "+g);<br />
<br />
System.out.println("h = "+h);<br />
<br />
System.out.println("i = "+i);<br />
<br />
System.out.println("j = "+j);<br />
<br />
System.out.println("k = "+k);<br />
<br />
}<br />
<br />
}<br />
<br />
其结果为:<br />
<br />
C:\＞java ArithmaticOp<br />
<br />
a = 9<br />
<br />
b = 18<br />
<br />
c = 4<br />
<br />
d = 14<br />
<br />
e = -14<br />
<br />
f = -2<br />
<br />
g = 18.4<br />
<br />
h = 2.4<br />
<br />
i = 5<br />
<br />
j = 3<br />
<br />
k = 5<br />
<br />
&#167; 3.2关 系 运 算 符<br />
<br />
关 系 运 算 符 用 来 比 较 两 个 值 ,返 回 布 尔 类 型 的 值 true或 false。 关 系 运 算 符 都 是 二 元 运 算<br />
<br />
符 ,如 下 表 所 示 :<br />
<br />
运算符 用法 返回true的情况<br />
<br />
＞ op1＞op2 op1大于op2<br />
<br />
＞+ op1＞=op2 op1大于或等于op2<br />
<br />
＜ op1＜op2 op1小于op2<br />
<br />
＜= op1＜=op2 op1小于或等于op2<br />
<br />
== op1==op2 op1与op2相等<br />
<br />
!= op1!=op2 op1与op2不等<br />
<br />
Java中 ,任 何 数 据 类 型 的 数 据 (包 括 基 本 类 型 和 组 合 类 型 )都 可 以 通 过 ==或 !=来 比 较 是 否<br />
<br />
相 等 (这 与 C、 C++不 同 )。<br />
<br />
关 系 运 算 的 结 果 返 回 true或 false,而 不 是 C、 C++中 的 1或 0。<br />
<br />
关 系 运 算 符 常 与 布 尔 逻 辑 运 算 符 一 起 使 用 ,作 为 流 控 制 语 句 的 判 断 条 件 。 如<br />
<br />
if( a＞b &amp;&amp; b==c)<br />
<br />
&#167; 3.3布 尔 逻 辑 运 算 符<br />
<br />
布 尔 逻 辑 运 算 符 进 行 布 尔 逻 辑 运 算 ,如 下 表 所 示 :<br />
<br />
op1 op2 op1&amp;&amp;op2 op1||op2 !op1<br />
<br />
false false false false true<br />
<br />
false true false true true<br />
<br />
true false false true false<br />
<br />
true true true true false<br />
<br />
}@@@<br />
<br />
?&amp;&amp;、‖<br />
<br />
为二元运算符,实现逻辑与、逻辑或。<br />
<br />
?! 为一元运算符,实现逻辑非。<br />
<br />
?对于布尔逻辑运算,先求出运算符左边的表达式的值,对或运算如果为true,则整个表<br />
<br />
达式的结果为true,不必对运算符右边的表达式再进行运算;同样,对与运算,如果左边表达式<br />
<br />
的值为false,则不必对右边的表达式求值,整个表达式的结果为false。<br />
<br />
下面的例子说明了关系运算符和布尔逻辑运算符的使用。<br />
<br />
@@@[<br />
<br />
public class RelationAndConditionOp{<br />
<br />
public static void main( String args[] ){<br />
<br />
int a=25,b=3;<br />
<br />
boolean d=a＜b; //d=false<br />
<br />
System.out.println("a＜b = "+d);<br />
<br />
int e=3;<br />
<br />
if(e!=0 &amp;&amp; a/e＞5)<br />
<br />
System.out.println("a/e = "+a/e);<br />
<br />
int f=0;<br />
<br />
if(f!=0 &amp;&amp; a/f＞5)<br />
<br />
System.out.println("a/f = "+a/f);<br />
<br />
else<br />
<br />
System.out.println("f = "+f);<br />
<br />
}<br />
<br />
}<br />
<br />
其运行结果为:<br />
<br />
C:\＞java RelationAndConditionOp<br />
<br />
a＜b = false<br />
<br />
a/e = 8<br />
<br />
f = 0<br />
<br />
注 意 :上 例 中 ,第 二 个 if语 句 在 运 行 时 不 会 发 生 除 0溢 出 的 错 误 ,因 为 e!=0为 false,所 以 就 不 需<br />
<br />
要 对 a/e进 行 运 算 。<br />
<br />
&#167; 3.4位 运 算 符<br />
<br />
位 运 算 符 用 来 对 二 进 制 位 进 行 操 作 ,Java中 提 供 了 如 下 表 所 示 的 位 运 算 符 :<br />
<br />
位 运 算 符 中 ,除<br />
<br />
～<br />
<br />
以 外 ,其 余 均 为 二 元 运 算 符 。<br />
<br />
操 作 数 只 能 为 整 型 和 字 符 型 数 据 。<br />
<br />
3.4.1补 码<br />
<br />
Java使 用 补 码 来 表 示 二 进 制 数 ,在 补 码 表 示 中 ,最 高 位 为 符 号 位 ,正 数 的 符 号 位 为 0,负 数<br />
<br />
为 1。 补 码 的 规 定 如 下 :<br />
<br />
对 正 数 来 说 ,最 高 位 为 0,其 余 各 位 代 表 数 值 本 身 (以 二 进 制 表 示 ),如 +42的 补 码 为<br />
<br />
00101010。<br />
<br />
对 负 数 而 言 ,把 该 数 绝 对 值 的 补 码 按 位 取 反 ,然 后 对 整 个 数 加 1,即 得 该 数 的 补 码 。 如<br />
<br />
-42的 补 码 为 11010110 (00101010 按 位 取 反 11010101 +1 11010110 )<br />
<br />
用 补 码 来 表 示 数 ,0的 补 码 是 唯 一 的 ,都 为 00000000。 (而 在 原 码 ,反 码 表 示 中 ,+0和 -0的 表 示<br />
<br />
是 不 唯 一 的 ,可 参 见 相 应 的 书 籍 )。 而 且 可 以 用 111111表 示 -1的 补 码 (这 也 是 补 码 与 原 码 和 反<br />
<br />
码 的 区 别 )。<br />
<br />
3.4.2按 位 取 反 运 算 符<br />
<br />
～<br />
<br />
～<br />
<br />
是 一 元 运 算 法 ,对 数 据 的 每 个 二 进 制 位 取 反 ,即 把 1变 为 0,把 0变 为 1。<br />
<br />
例 如 :<br />
<br />
0010101<br />
<br />
～<br />
<br />
1101010<br />
<br />
注 意 ,～ 运 算 符 与 - 运 算 符 不 同 ,～ 21&#8800; -21。<br />
<br />
3.4.3按 位 与 运 算 符 &amp;<br />
<br />
参 与 运 算 的 两 个 值 ,如 果 两 个 相 应 位 都 为 1,则 该 位 的 结 果 为 1,否 则 为 0。 即 :<br />
<br />
0 &amp; 0 = 0,0 &amp;1 = 0,1 &amp; 0 = 0,1 &amp; 1 = 1<br />
<br />
</p>
<p><strong>移位运算符</strong>
</p>
<p>&nbsp;&nbsp;&nbsp; 包括：<br />
&nbsp;&nbsp;&nbsp; &#8220;&gt;&gt; 右移&#8221;；&#8220;&lt;&lt; 左移&#8221;；&#8220;&gt;&gt;&gt; 无符号右移&#8221;</p>
<p>例子：<br />
-5&gt;&gt;3=-1<br />
1111 1111 1111 1111 1111 1111 1111 1011<br />
1111 1111 1111 1111 1111 1111 1111 1111<br />
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。</p>
<p>-5&lt;&lt;3=-40<br />
1111 1111 1111 1111 1111 1111 1111 1011<br />
1111 1111 1111 1111 1111 1111 1101 1000 <br />
其结果与 -5*2*2*2 完全相同。</p>
<p>5&gt;&gt;3=0<br />
0000 0000 0000 0000 0000 0000 0000 0101<br />
0000 0000 0000 0000 0000 0000 0000 0000<br />
其结果与 5/(2*2*2) 完全相同。</p>
<p>5&lt;&lt;3=40<br />
0000 0000 0000 0000 0000 0000 0000 0101<br />
0000 0000 0000 0000 0000 0000 0010 1000<br />
其结果与 5*2*2*2 完全相同。</p>
<p>-5&gt;&gt;&gt;3=536870911&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
1111 1111 1111 1111 1111 1111 1111 1011<br />
0001 1111 1111 1111 1111 1111 1111 1111</p>
<p>无论正数、负数，它们的右移、左移、无符号右移 32 位都是其本身，比如 -5&lt;&lt;32=-5、-5&gt;&gt;32=-5、-5&gt;&gt;&gt;32=-5。<br />
一个有趣的现象是，把 1 左移 31 位再右移 31 位，其结果为 -1。<br />
0000 0000 0000 0000 0000 0000 0000 0001<br />
1000 0000 0000 0000 0000 0000 0000 0000<br />
1111 1111 1111 1111 1111 1111 1111 1111</p>
<p><strong><br />
&nbsp;</strong>
<span style="font-size: 10pt;">Java&nbsp;定义的位运算（bitwise&nbsp;operators&nbsp;）直接对整数类型的位进行操作，这些整数类型包括long，int，short，char，and&nbsp;byte&nbsp;。表4-2&nbsp;列出了位运算：&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 运算符&nbsp;结果&nbsp; <br />
&nbsp;&nbsp;&nbsp; ~&nbsp;按位非（NOT）（一元运算）&nbsp; <br />
&nbsp;&nbsp;&nbsp; &amp;&nbsp;按位与（AND）&nbsp; <br />
&nbsp;&nbsp;&nbsp; |&nbsp;按位或（OR）&nbsp; <br />
&nbsp;&nbsp;&nbsp; ^&nbsp;按位异或（XOR）&nbsp; <br />
&nbsp;&nbsp;&nbsp; &gt;&gt;&nbsp;右移&nbsp; <br />
&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;&nbsp;右移，左边空出的位以0填充&nbsp; <br />
&nbsp;&nbsp;&nbsp; 运算符&nbsp;结果&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;&lt;&nbsp;左移&nbsp; <br />
&nbsp;&nbsp;&nbsp; &amp;=&nbsp;按位与赋值&nbsp; <br />
&nbsp;&nbsp;&nbsp; |=&nbsp;按位或赋值&nbsp; <br />
&nbsp;&nbsp;&nbsp; ^=&nbsp;按位异或赋值&nbsp; <br />
&nbsp;&nbsp;&nbsp; &gt;&gt;=&nbsp;右移赋值&nbsp; <br />
&nbsp;&nbsp;&nbsp; &gt;&gt;&gt;=&nbsp;右移赋值，左边空出的位以0填充&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;&lt;=&nbsp;左移赋值&nbsp; <br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 既然位运算符在整数范围内对位操作，因此理解这样的操作会对一个值产生什么效果是重要的。具体地说，知道Java&nbsp;是如何存储整数值并且如何表示负数的是有用的。因此，在继续讨论之前，让我们简短概述一下这两个话题。 <br />
<br />
&nbsp;&nbsp;&nbsp;
所有的整数类型以二进制数字位的变化及其宽度来表示。例如，byte&nbsp;型值42的二进制代码是00101010&nbsp;，其中每个位置在此代表2的次方，在最右
边的位以20开始。向左下一个位置将是21，或2，依次向左是22，或4，然后是8，16，32等等，依此类推。因此42在其位置1，3，5的值为1（从
右边以0开始数）；这样42是21+23+25的和，也即是2+8+32&nbsp;。 <br />
<br />
&nbsp;&nbsp;&nbsp;
所有的整数类型（除了char&nbsp;类型之外）都是有符号的整数。这意味着他们既能表示正数，又能表示负数。Java&nbsp;使用大家知道的2的补码
（two&#8217;s&nbsp;complement&nbsp;）这种编码来表示负数，也就是通过将与其对应的正数的二进制代码取反（即将1变成0，将0变成1），然后对其结果加
1。例如，-42就是通过将42的二进制代码的各个位取反，即对00101010&nbsp;取反得到11010101&nbsp;，然后再加1，得到11010110&nbsp;，即
-42&nbsp;。要对一个负数解码，首先对其所有的位取反，然后加1。例如-42，或11010110&nbsp;取反后为00101001&nbsp;，或41，然后加1，这样就
得到了42。 <br />
<br />
&nbsp;&nbsp;&nbsp;
如果考虑到零的交叉（zero&nbsp;crossing&nbsp;）问题，你就容易理解Java&nbsp;（以及其他绝大多数语言）这样用2的补码的原因。假定byte&nbsp;类型的
值零用00000000&nbsp;代表。它的补码是仅仅将它的每一位取反，即生成11111111&nbsp;，它代表负零。但问题是负零在整数数学中是无效的。为了解决负
零的问题，在使用2的补码代表负数的值时，对其值加1。即负零11111111&nbsp;加1后为100000000&nbsp;。但这样使1位太靠左而不适合返回到
byte&nbsp;类型的值，因此人们规定，-0和0的表示方法一样，-1的解码为11111111&nbsp;。尽管我们在这个例子使用了byte&nbsp;类型的值，但同样的基
本的原则也适用于所有Java&nbsp;的整数类型。 <br />
<br />
&nbsp;&nbsp;&nbsp;
因为Java&nbsp;使用2的补码来存储负数，并且因为Java&nbsp;中的所有整数都是有符号的，这样应用位运算符可以容易地达到意想不到的结果。例如，不管你如何
打算，Java&nbsp;用高位来代表负数。为避免这个讨厌的意外，请记住不管高位的顺序如何，它决定一个整数的符号。 <br />
<br />
&nbsp;&nbsp;&nbsp; 4.2.1&nbsp;位逻辑运算符 <br />
位逻辑运算符有&#8220;与&#8221;（AND）、&#8220;或&#8221;（OR）、&#8220;异或（XOR&nbsp;）&#8221;、&#8220;非（NOT）&#8221;，分别用&#8220;&amp;&#8221;、&#8220;|&#8221;、&#8220;^&#8221;、&#8220;~&#8221;表示，4-3&nbsp;表显示了每个位逻辑运算的结果。在继续讨论之前，请记住位运算符应用于每个运算数内的每个单独的位。 <br />
&nbsp;&nbsp;&nbsp; 表4-3&nbsp;位逻辑运算符的结果&nbsp; <br />
&nbsp;&nbsp; A&nbsp;0&nbsp;1&nbsp;0&nbsp;1&nbsp;B&nbsp;0&nbsp;0&nbsp;1&nbsp;1&nbsp;A&nbsp;|&nbsp;B&nbsp;0&nbsp;1&nbsp;1&nbsp;1&nbsp;A&nbsp;&amp;&nbsp;B&nbsp;0&nbsp;0&nbsp;0&nbsp;1&nbsp;A&nbsp;^&nbsp;B&nbsp;0&nbsp;1&nbsp;1&nbsp;0&nbsp;~A&nbsp;1&nbsp;0&nbsp;1&nbsp;0&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 按位非（NOT） <br />
<br />
&nbsp;&nbsp;&nbsp; 按位非也叫做补，一元运算符NOT&#8220;~&#8221;是对其运算数的每一位取反。例如，数字42，它的二进制代码为： <br />
<br />
&nbsp;&nbsp;&nbsp; 00101010&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 经过按位非运算成为 <br />
<br />
&nbsp;&nbsp;&nbsp; 11010101&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 按位与（AND） <br />
<br />
&nbsp;&nbsp;&nbsp; 按位与运算符&#8220;&amp;&#8221;，如果两个运算数都是1，则结果为1。其他情况下，结果均为零。看下面的例子： <br />
<br />
&nbsp;&nbsp;&nbsp; 00101010&nbsp;42&nbsp;&amp;00001111&nbsp;15&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 00001010&nbsp;10&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 按位或（OR） <br />
<br />
&nbsp;&nbsp;&nbsp; 按位或运算符&#8220;|&#8221;，任何一个运算数为1，则结果为1。如下面的例子所示： <br />
<br />
&nbsp;&nbsp;&nbsp; 00101010&nbsp;42&nbsp;|&nbsp;00001111&nbsp;15&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 00101111&nbsp;47&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 按位异或（XOR） <br />
<br />
&nbsp;&nbsp;&nbsp;
按位异或运算符&#8220;^&#8221;，只有在两个比较的位不同时其结果是&nbsp;1。否则，结果是零。下面的例子显示了&#8220;^&#8221;运算符的效果。这个例子也表明了XOR&nbsp;运算符的
一个有用的属性。注意第二个运算数有数字1的位，42对应二进制代码的对应位是如何被转换的。第二个运算数有数字0的位，第一个运算数对应位的数字不变。
当对某些类型进行位运算时，你将会看到这个属性的用处。 <br />
<br />
&nbsp;&nbsp;&nbsp; 00101010&nbsp;42&nbsp;^&nbsp;00001111&nbsp;15&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 00100101&nbsp;37 <br />
&nbsp;&nbsp;&nbsp; 位逻辑运算符的应用 <br />
</span>
</p>
<p><span style="font-size: x-small;">下面的例子说明了位逻辑运算符： <br />
</span>
</p>
<div style="overflow: auto; width: 500px;">
<pre><span style="font-size: x-small;">//&nbsp;Demonstrate&nbsp;the&nbsp;bitwise&nbsp;logical&nbsp;operators. <br />
class&nbsp;BitLogic&nbsp;{ <br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
<br />
<br />
String&nbsp;binary[]&nbsp;=&nbsp;{"0000",&nbsp;"0001",&nbsp;"0010",&nbsp;"0011",&nbsp;"0100",&nbsp;"0101",&nbsp;"0110",&nbsp;"0111",&nbsp;"1000",&nbsp;"1001",&nbsp;"1010",&nbsp;"1011",&nbsp;"1100",&nbsp;"1101",&nbsp;"1110",&nbsp;"1111"&nbsp; <br />
<br />
}; <br />
int&nbsp;a&nbsp;=&nbsp;3;&nbsp;//&nbsp;0&nbsp;+&nbsp;2&nbsp;+&nbsp;1&nbsp;or&nbsp;0011&nbsp;in&nbsp;binary <br />
int&nbsp;b&nbsp;=&nbsp;6;&nbsp;//&nbsp;4&nbsp;+&nbsp;2&nbsp;+&nbsp;0&nbsp;or&nbsp;0110&nbsp;in&nbsp;binary <br />
int&nbsp;c&nbsp;=&nbsp;a&nbsp;|&nbsp;b; <br />
int&nbsp;d&nbsp;=&nbsp;a&nbsp;&amp;&nbsp;b;&nbsp; <br />
int&nbsp;e&nbsp;=&nbsp;a&nbsp;^&nbsp;b;&nbsp; <br />
int&nbsp;f&nbsp;=&nbsp;(~a&nbsp;&amp;&nbsp;b)&nbsp;|&nbsp;(a&nbsp;&amp;&nbsp;~b); <br />
int&nbsp;g&nbsp;=&nbsp;~a&nbsp;&amp;&nbsp;0x0f;&nbsp; <br />
<br />
<br />
System.out.println("&nbsp;a&nbsp;=&nbsp;"&nbsp;+&nbsp;binary[a]); <br />
System.out.println("&nbsp;b&nbsp;=&nbsp;"&nbsp;+&nbsp;binary<strong>); <br />
System.out.println("&nbsp;a|b&nbsp;=&nbsp;"&nbsp;+&nbsp;binary[c]); <br />
System.out.println("&nbsp;a&amp;b&nbsp;=&nbsp;"&nbsp;+&nbsp;binary[d]); <br />
System.out.println("&nbsp;a^b&nbsp;=&nbsp;"&nbsp;+&nbsp;binary[e]); <br />
System.out.println("~a&amp;b|a&amp;~b&nbsp;=&nbsp;"&nbsp;+&nbsp;binary[f]); <br />
System.out.println("&nbsp;~a&nbsp;=&nbsp;"&nbsp;+&nbsp;binary[g]); <br />
<br />
<br />
} <br />
} <br />
</strong><br />
</span><br />
<strong><br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp;
在本例中，变量a与b对应位的组合代表了二进制数所有的&nbsp;4&nbsp;种组合模式：0-0，0-1，1-0&nbsp;，和1-1&nbsp;。&#8220;|&#8221;运算符和&#8220;&amp;&#8221;运算符分
别对变量a与b各个对应位的运算得到了变量c和变量d的值。对变量e和f的赋值说明了&#8220;^&#8221;运算符的功能。字符串数组binary&nbsp;代表了0到15&nbsp;对应
的二进制的值。在本例中，数组各元素的排列顺序显示了变量对应值的二进制代码。数组之所以这样构造是因为变量的值n对应的二进制代码可以被正确的存储在数
组对应元素binary[n]&nbsp;中。例如变量a的值为3，则它的二进制代码对应地存储在数组元素binary[3]&nbsp;中。~a的值与数字0x0f&nbsp;（对应
二进制为0000&nbsp;1111&nbsp;）进行按位与运算的目的是减小~a的值，保证变量g的结果小于16。因此该程序的运行结果可以用数组binary&nbsp;对应的元
素来表示。该程序的输出如下： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">a&nbsp;=&nbsp;0011&nbsp;b&nbsp;=&nbsp;0110&nbsp;a|b&nbsp;=&nbsp;0111&nbsp;a&amp;b&nbsp;=&nbsp;0010&nbsp;a^b&nbsp;=&nbsp;0101&nbsp;~a&amp;b|a&amp;~b&nbsp;=&nbsp;0101&nbsp;~a&nbsp;=&nbsp;1100&nbsp; </span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 4.2.2&nbsp;左移运算符 <br />
&nbsp;&nbsp;&nbsp; 左移运算符&lt;&lt;使指定值的所有位都左移规定的次数。它的通用格式如下所示： <br />
<br />
&nbsp;&nbsp;&nbsp; value&nbsp;&lt;&lt;&nbsp;num <br />
&nbsp;&nbsp;&nbsp;
这里，num&nbsp;指定要移位值value&nbsp;移动的位数。也就是，左移运算符&lt;&lt;使指定值的所有位都左移num位。每左移一个位，高阶位都被移出
（并且丢弃），并用0填充右边。这意味着当左移的运算数是int&nbsp;类型时，每移动1位它的第31位就要被移出并且丢弃；当左移的运算数是long&nbsp;类型
时，每移动1位它的第63位就要被移出并且丢弃。 <br />
<br />
&nbsp;&nbsp;&nbsp;
在对byte&nbsp;和short类型的值进行移位运算时，你必须小心。因为你知道Java&nbsp;在对表达式求值时，将自动把这些类型扩大为&nbsp;int&nbsp;型，而且，表
达式的值也是int&nbsp;型。对byte&nbsp;和short类型的值进行移位运算的结果是int&nbsp;型，而且如果左移不超过31位，原来对应各位的值也不会丢弃。但
是，如果你对一个负的byte&nbsp;或者short类型的值进行移位运算，它被扩大为int&nbsp;型后，它的符号也被扩展。这样，整数值结果的高位就会被1填充。
因此，为了得到正确的结果，你就要舍弃得到结果的高位。这样做的最简单办法是将结果转换为byte&nbsp;型。下面的程序说明了这一点： </span>
<br />
<br />
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;a&nbsp;byte&nbsp;value. <br />
class&nbsp;ByteShift&nbsp;{<br />
<br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
byte&nbsp;a&nbsp;=&nbsp;64,&nbsp;b;<br />
<br />
int&nbsp;i;&nbsp; <br />
<br />
<br />
i&nbsp;=&nbsp;a&nbsp;&lt;&lt;&nbsp;2; <br />
b&nbsp;=&nbsp;(byte)&nbsp;(a&nbsp;&lt;&lt;&nbsp;2);&nbsp;<br />
<br />
<br />
<br />
System.out.println("Original&nbsp;value&nbsp;of&nbsp;a:&nbsp;"&nbsp;+&nbsp;a);<br />
<br />
System.out.println("i&nbsp;and&nbsp;b:&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;b); <br />
} <br />
} </span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 该程序产生的输出下所示： <br />
<br />
<div style="overflow: auto; width: 500px;">
<pre>Original&nbsp;value&nbsp;of&nbsp;a:&nbsp;64 <br />
i&nbsp;and&nbsp;b:&nbsp;256&nbsp;0&nbsp;<br />
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<br />
<br />
</pre>
</div>
</span>
<span style="font-size: x-small;"> 因变量a在赋值表达式中，故被扩大为int&nbsp;型，64（0100&nbsp;0000&nbsp;）被左移两次生成值256&nbsp;（10000&nbsp;0000&nbsp;）被赋给变量i。然而，经过左移后，变量b中惟一的1被移出，低位全部成了0，因此b的值也变成了0。 <br />
<br />
&nbsp;&nbsp;&nbsp; 既然每次左移都可以使原来的操作数翻倍，程序员们经常使用这个办法来进行快速的2&nbsp;的乘法。但是你要小心，如果你将1移进高阶位（31或63位），那么该值将变为负值。下面的程序说明了这一点： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;as&nbsp;a&nbsp;quick&nbsp;way&nbsp;to&nbsp;multiply&nbsp;by&nbsp;2. <br />
class&nbsp;MultByTwo&nbsp;{ <br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
int&nbsp;i; <br />
int&nbsp;num&nbsp;=&nbsp;0xFFFFFFE;&nbsp; <br />
<br />
<br />
for(i=0;&nbsp;i&lt;4;&nbsp;i++)&nbsp;{ <br />
num&nbsp;=&nbsp;num&nbsp;&lt;&lt;&nbsp;1;&nbsp; <br />
System.out.println(num); <br />
<br />
<br />
} <br />
} <br />
</span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp;
这里，num&nbsp;指定要移位值value&nbsp;移动的位数。也就是，左移运算符&lt;&lt;使指定值的所有位都左移num位。每左移一个位，高阶位都被移出
（并且丢弃），并用0填充右边。这意味着当左移的运算数是int&nbsp;类型时，每移动1位它的第31位就要被移出并且丢弃；当左移的运算数是long&nbsp;类型
时，每移动1位它的第63位就要被移出并且丢弃。 <br />
<br />
&nbsp;&nbsp;&nbsp;
在对byte&nbsp;和short类型的值进行移位运算时，你必须小心。因为你知道Java&nbsp;在对表达式求值时，将自动把这些类型扩大为&nbsp;int&nbsp;型，而且，表
达式的值也是int&nbsp;型。对byte&nbsp;和short类型的值进行移位运算的结果是int&nbsp;型，而且如果左移不超过31位，原来对应各位的值也不会丢弃。但
是，如果你对一个负的byte&nbsp;或者short类型的值进行移位运算，它被扩大为int&nbsp;型后，它的符号也被扩展。这样，整数值结果的高位就会被1填充。
因此，为了得到正确的结果，你就要舍弃得到结果的高位。这样做的最简单办法是将结果转换为byte&nbsp;型。下面的程序说明了这一点： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;a&nbsp;byte&nbsp;value. <br />
class&nbsp;ByteShift&nbsp;{ <br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
byte&nbsp;a&nbsp;=&nbsp;64,&nbsp;b; <br />
int&nbsp;i;&nbsp; <br />
<br />
<br />
i&nbsp;=&nbsp;a&nbsp;&lt;&lt;&nbsp;2; <br />
b&nbsp;=&nbsp;(byte)&nbsp;(a&nbsp;&lt;&lt;&nbsp;2);&nbsp; <br />
<br />
<br />
System.out.println("Original&nbsp;value&nbsp;of&nbsp;a:&nbsp;"&nbsp;+&nbsp;a); <br />
System.out.println("i&nbsp;and&nbsp;b:&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;b); <br />
} <br />
} <br />
</span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 该程序产生的输出下所示：<br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><strong><span style="font-size: x-small;"><img src="http://129.0.0.116/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
Original&nbsp;value&nbsp;of&nbsp;a:&nbsp;64 <br />
i&nbsp;and&nbsp;b:&nbsp;256&nbsp;0&nbsp; <br />
</span><br />
</strong>
</div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 因变量a在赋值表达式中，故被扩大为int&nbsp;型，64（0100&nbsp;0000&nbsp;）被左移两次生成值256&nbsp;（10000&nbsp;0000&nbsp;）被赋给变量i。然而，经过左移后，变量b中惟一的1被移出，低位全部成了0，因此b的值也变成了0。 <br />
<br />
&nbsp;&nbsp;&nbsp; 既然每次左移都可以使原来的操作数翻倍，程序员们经常使用这个办法来进行快速的2&nbsp;的乘法。但是你要小心，如果你将1移进高阶位（31或63位），那么该值将变为负值。下面的程序说明了这一点： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;as&nbsp;a&nbsp;quick&nbsp;way&nbsp;to&nbsp;multiply&nbsp;by&nbsp;2. <br />
class&nbsp;MultByTwo&nbsp;{ <br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
int&nbsp;i; <br />
int&nbsp;num&nbsp;=&nbsp;0xFFFFFFE;&nbsp; <br />
<br />
<br />
for(i=0;&nbsp;i&lt;4;&nbsp;i++)&nbsp;{ <br />
num&nbsp;=&nbsp;num&nbsp;&lt;&lt;&nbsp;1;&nbsp; <br />
System.out.println(num); <br />
<br />
<br />
} <br />
} <br />
}&nbsp; <br />
</span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 该程序的输出如下所示：<br />
<div style="overflow: auto; width: 500px;">
<pre>536870908&nbsp; <br />
1073741816&nbsp; <br />
2147483632&nbsp; <br />
-32&nbsp;<br />
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<br />
</pre>
</div>
</span>
<br />
<br />
<span style="font-size: x-small;"> 因变量a在赋值表达式中，故被扩大为int&nbsp;型，64（0100&nbsp;0000&nbsp;）被左移两次生成值256&nbsp;（10000&nbsp;0000&nbsp;）被赋给变量i。然而，经过左移后，变量b中惟一的1被移出，低位全部成了0，因此b的值也变成了0。 <br />
<br />
&nbsp;&nbsp;&nbsp; 既然每次左移都可以使原来的操作数翻倍，程序员们经常使用这个办法来进行快速的2&nbsp;的乘法。但是你要小心，如果你将1移进高阶位（31或63位），那么该值将变为负值。下面的程序说明了这一点： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;as&nbsp;a&nbsp;quick&nbsp;way&nbsp;to&nbsp;multiply&nbsp;by&nbsp;2. <br />
class&nbsp;MultByTwo&nbsp;{ <br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
int&nbsp;i; <br />
int&nbsp;num&nbsp;=&nbsp;0xFFFFFFE;&nbsp; <br />
<br />
<br />
for(i=0;&nbsp;i&lt;4;&nbsp;i++)&nbsp;{ <br />
num&nbsp;=&nbsp;num&nbsp;&lt;&lt;&nbsp;1;&nbsp; <br />
System.out.println(num); <br />
<br />
<br />
} <br />
} <br />
</span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp;
这里，num&nbsp;指定要移位值value&nbsp;移动的位数。也就是，左移运算符&lt;&lt;使指定值的所有位都左移num位。每左移一个位，高阶位都被移出
（并且丢弃），并用0填充右边。这意味着当左移的运算数是int&nbsp;类型时，每移动1位它的第31位就要被移出并且丢弃；当左移的运算数是long&nbsp;类型
时，每移动1位它的第63位就要被移出并且丢弃。 <br />
<br />
&nbsp;&nbsp;&nbsp;
在对byte&nbsp;和short类型的值进行移位运算时，你必须小心。因为你知道Java&nbsp;在对表达式求值时，将自动把这些类型扩大为&nbsp;int&nbsp;型，而且，表
达式的值也是int&nbsp;型。对byte&nbsp;和short类型的值进行移位运算的结果是int&nbsp;型，而且如果左移不超过31位，原来对应各位的值也不会丢弃。但
是，如果你对一个负的byte&nbsp;或者short类型的值进行移位运算，它被扩大为int&nbsp;型后，它的符号也被扩展。这样，整数值结果的高位就会被1填充。
因此，为了得到正确的结果，你就要舍弃得到结果的高位。这样做的最简单办法是将结果转换为byte&nbsp;型。下面的程序说明了这一点： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;a&nbsp;byte&nbsp;value. <br />
class&nbsp;ByteShift&nbsp;{ <br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
byte&nbsp;a&nbsp;=&nbsp;64,&nbsp;b; <br />
int&nbsp;i;&nbsp; <br />
<br />
<br />
i&nbsp;=&nbsp;a&nbsp;&lt;&lt;&nbsp;2; <br />
b&nbsp;=&nbsp;(byte)&nbsp;(a&nbsp;&lt;&lt;&nbsp;2);&nbsp; <br />
<br />
<br />
System.out.println("Original&nbsp;value&nbsp;of&nbsp;a:&nbsp;"&nbsp;+&nbsp;a); <br />
System.out.println("i&nbsp;and&nbsp;b:&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;b); <br />
} <br />
} <br />
</span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 该程序产生的输出下所示：<br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><strong><span style="font-size: x-small;"><img src="http://129.0.0.116/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
Original&nbsp;value&nbsp;of&nbsp;a:&nbsp;64 <br />
i&nbsp;and&nbsp;b:&nbsp;256&nbsp;0&nbsp; <br />
</span><br />
</strong>
</div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 因变量a在赋值表达式中，故被扩大为int&nbsp;型，64（0100&nbsp;0000&nbsp;）被左移两次生成值256&nbsp;（10000&nbsp;0000&nbsp;）被赋给变量i。然而，经过左移后，变量b中惟一的1被移出，低位全部成了0，因此b的值也变成了0。 <br />
<br />
&nbsp;&nbsp;&nbsp; 既然每次左移都可以使原来的操作数翻倍，程序员们经常使用这个办法来进行快速的2&nbsp;的乘法。但是你要小心，如果你将1移进高阶位（31或63位），那么该值将变为负值。下面的程序说明了这一点： <br />
</span>
</strong>
</p>
<div style="overflow: auto; width: 500px;">
<pre><strong><span style="font-size: x-small;">//&nbsp;Left&nbsp;shifting&nbsp;as&nbsp;a&nbsp;quick&nbsp;way&nbsp;to&nbsp;multiply&nbsp;by&nbsp;2. <br />
class&nbsp;MultByTwo&nbsp;{ <br />
<br />
<br />
public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
int&nbsp;i; <br />
int&nbsp;num&nbsp;=&nbsp;0xFFFFFFE;&nbsp; <br />
<br />
<br />
for(i=0;&nbsp;i&lt;4;&nbsp;i++)&nbsp;{ <br />
num&nbsp;=&nbsp;num&nbsp;&lt;&lt;&nbsp;1;&nbsp; <br />
System.out.println(num); <br />
<br />
<br />
} <br />
} <br />
}&nbsp; <br />
</span><br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
</div>
<p>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 该程序的输出如下所示：<br />
<div style="overflow: auto; width: 500px;">
<pre>536870908&nbsp; <br />
1073741816&nbsp; <br />
2147483632&nbsp; <br />
-32&nbsp;<br />
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<br />
</pre>
</div>
</span>
<br />
</strong>
</p>
<pre><strong><span style="font-size: x-small;"><br />
}; <br />
byte&nbsp;b&nbsp;=&nbsp;(byte)&nbsp;0xf1;&nbsp; <br />
<br />
<br />
System.out.println("b&nbsp;=&nbsp;0x"&nbsp;+&nbsp;hex[(b&nbsp;&gt;&gt;&nbsp;4)&nbsp;&amp;&nbsp;0x0f]&nbsp;+&nbsp;hex[b&nbsp;&amp;&nbsp;0x0f]);}}&nbsp; </span><br />
<br />
<br />
</strong>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<strong><br />
</strong>
</pre>
<strong><span style="font-size: x-small;">&nbsp;&nbsp;&nbsp; 该程序的输出如下：<br />
<div style="overflow: auto; width: 500px;">
<pre>b&nbsp;=&nbsp;0xf1&nbsp;<br />
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<br />
</pre>
</div>
&nbsp;&nbsp; &nbsp;4 .2.4&nbsp;无符号右移 <br />
&nbsp;&nbsp;&nbsp;
正如上面刚刚看到的，每一次右移，&gt;&gt;运算符总是自动地用它的先前最高位的内容补它的最高位。这样做保留了原值的符号。但有时这并不是我们想
要的。例如，如果你进行移位操作的运算数不是数字值，你就不希望进行符号位扩展（保留符号位）。当你处理像素值或图形时，这种情况是相当普遍的。在这种情
况下，不管运算数的初值是什么，你希望移位后总是在高位（最左边）补0。这就是人们所说的无符号移动（unsigned&nbsp;shift&nbsp;）。这时你可以使用
Java&nbsp;的无符号右移运算符&gt;&gt;&gt;&nbsp;，它总是在左边补0。 <br />
<br />
&nbsp;&nbsp;&nbsp; 下面的程序段说明了无符号右移运算符&gt;&gt;&gt;&nbsp;。在本例中，变量a被赋值为-1，用二进制表示就是32位全是1。这个值然后被无符号右移24位，当然它忽略了符号位扩展，在它的左边总是补0。这样得到的值255被赋给变量a。 <br />
<br />
&nbsp;&nbsp;&nbsp; int&nbsp;a&nbsp;=&nbsp;-1;&nbsp;a&nbsp;=&nbsp;a&nbsp;&gt;&gt;&gt;&nbsp;24;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 下面用二进制形式进一步说明该操作： <br />
<br />
&nbsp;&nbsp;&nbsp; 11111111&nbsp;11111111&nbsp;11111111&nbsp;11111111&nbsp;int型-1的二进制代码&gt;&gt;&gt;&nbsp;24&nbsp;无符号右移24位00000000&nbsp;00000000&nbsp;00000000&nbsp;11111111&nbsp;int型255的二进制代码 <br />
<br />
&nbsp;&nbsp;&nbsp;
由于无符号右移运算符&gt;&gt;&gt;&nbsp;只是对32位和64位的值有意义，所以它并不像你想象的那样有用。因为你要记住，在表达式中过小的值总是
被自动扩大为int&nbsp;型。这意味着符号位扩展和移动总是发生在32位而不是8位或16位。这样，对第7位以0开始的byte&nbsp;型的值进行无符号移动是不可
能的，因为在实际移动运算时，是对扩大后的32位值进行操作。下面的例子说明了这一点： <br />
<div style="overflow: auto; width: 500px;">
<pre>//&nbsp;Unsigned&nbsp;shifting&nbsp;a&nbsp;byte&nbsp;value. <br />
class&nbsp;ByteUShift&nbsp;{ <br />
static&nbsp;public&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <br />
int&nbsp;b&nbsp;=&nbsp;2; <br />
int&nbsp;c&nbsp;=&nbsp;3;&nbsp; <br />
<br />
<br />
a&nbsp;|=&nbsp;4; <br />
b&nbsp;&gt;&gt;=&nbsp;1;&nbsp; <br />
c&nbsp;&lt;&lt;=&nbsp;1;&nbsp; <br />
a&nbsp;^=&nbsp;c; <br />
System.out.println("a&nbsp;=&nbsp;"&nbsp;+&nbsp;a); <br />
System.out.println("b&nbsp;=&nbsp;"&nbsp;+&nbsp;b); <br />
System.out.println("c&nbsp;=&nbsp;"&nbsp;+&nbsp;c); <br />
<br />
<br />
} <br />
} <br />
<br />
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--></div>
<br />
<br />
</pre>
</div>
&nbsp;&nbsp;&nbsp; 该程序的输出如下所示：<br />
<div style="overflow: auto; width: 500px;">
<pre>a&nbsp;=&nbsp;3&nbsp; <br />
b&nbsp;=&nbsp;1&nbsp; <br />
c&nbsp;=&nbsp;6 <br />
<br />
<br />
</pre>
</div>
</span></strong><img src ="http://www.blogjava.net/gooogle/aggbug/193654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-17 10:19 <a href="http://www.blogjava.net/gooogle/archive/2008/04/17/193654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# 采用线程重绘图形应该注意的问题。</title><link>http://www.blogjava.net/gooogle/archive/2008/04/11/192155.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Fri, 11 Apr 2008 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/11/192155.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/192155.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/11/192155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/192155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/192155.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>原文</p>
<p><a href="http://www.3geye.net/?3/viewspace-3350">http://www.3geye.net/?3/viewspace-3350</a>
</p>
<p>&nbsp;</p>
<p>
大家都知道J2ME 采用一个线程去获取数据，然后得到数据后更新屏幕是件很容易的事情，<br />
<span style="display: none;">`n
hxq1u^3</span>
比如<br />
<span style="display: none;">hQ.Pd0P%r$~f3</span>
Thread{<br />
<span style="display: none;">7Quk%n+_&amp;gar(K3</span>
public void run(){<span style="display: none;">3GEYE4l`_.w
v6?z5P</span>
<br />
getData();<br />
<span style="display: none;">^:LE%@5k?-l3</span>
repaint();<span style="display: none;">3GEYE6Z+M"W.K6h[3e</span>
<br />
}<br />
<span style="display: none;">+ZnLPk/jL)m f3</span>
<br />
<span style="display: none;">.\1X `1}"iN3</span>
}<br />
<span style="display: none;">T7q(M!vx+Z+i
k)U3</span>
这样做就OK了<span style="display: none;">3GEYER`8IL8S!I|+jFa</span>
<br />
<br />
<span style="display: none;">%LQ#LR"FgX3</span>
但是这个方法在C#上能成功吗。<br />
<span style="display: none;">	dV(],d.G3</span>
答案是NO，为什么呢。安装他们的APIs的说法是，采用线程更新屏幕的是应该要用一个委托的方式来执行。<br />
<span style="display: none;">,p~Zy_g&amp;V:Z3</span>
<span style="display: none;">3GEYEmH"L*T2?i:e</span>
<br />
看看我是怎么做的。<span style="display: none;">3GEYE2M?{}	VC#O#tqa</span>
<br />
<br />
<span style="display: none;">|R_a#|R8g3</span>
Thread{<br />
<span style="display: none;">GXY0c:~3@^3</span>
public void run(){<span style="display: none;">3GEYEl
E8ap a*u~-a9E\@</span>
<br />
getData();<span style="display: none;">3GEYEGQKLb*CI</span>
<br />
updateWebBrowser();<br />
<span style="display: none;">+P5?!K;f#m6D#H3</span>
}<span style="display: none;">3GEYE}I4\)r&amp;`$Jj1Y</span>
<br />
<br />
<span style="display: none;"> ZY,d%Suw5K3</span>
delegate void Repaint();<span style="display: none;">3GEYE!g.|Z5}t7f#`�j</span>
<br />
<br />
<span style="display: none;">D6Ez{y0t3</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void repaint()<span style="display: none;">3GEYEy&amp;Yi1m	i*S"C9J$E</span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<span style="display: none;">A	[So:?3</span>
<br />
<span style="display: none;">7KY%L6O
C!M
t3</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.webBrowser.repaint();<span style="display: none;">3GEYE*T4C})c
Vn]</span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<span style="display: none;">H5{^"g/VM3</span>
<br />
<span style="display: none;">&amp;kz$^e&amp;b3</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<span style="display: none;">3GEYEb
|\$`lh</span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 更新视图<br />
<span style="display: none;">8I}o&amp;J&amp;t/mW3</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
<span style="display: none;">n*gx	phQQ9o3</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void updateWebBrowser()<span style="display: none;">3GEYE:Q-T+P5{4E</span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<span style="display: none;">
a6w)V�mo4D0N3</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这里是更新屏幕的代码，看各自需求做相应的实现。<span style="display: none;">3GEYE&amp;h:OBm,Ukm2y</span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<span style="display: none;">?
GN!~Vm3</span>
<br />
<span style="display: none;">7y6m#a-ND	a(o3</span>
}<span style="display: none;">3GEYE+R!f9AH,@�k"K	y</span>
<br />
<br />
<span style="display: none;">-YgB'B/U
|3</span>
上面就是C#的处理方式。应该也是可以理解的</p>
</div><img src ="http://www.blogjava.net/gooogle/aggbug/192155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-11 12:45 <a href="http://www.blogjava.net/gooogle/archive/2008/04/11/192155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>七个优秀的开源J2ME项目</title><link>http://www.blogjava.net/gooogle/archive/2008/04/10/191876.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Thu, 10 Apr 2008 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/10/191876.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/191876.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/10/191876.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/191876.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/191876.html</trackback:ping><description><![CDATA[<h2><br />
</h2>
<h2>文章出处：<a href="http://www.3geye.net/?3/viewspace-3347">http://www.3geye.net/?3/viewspace-3347</a>
<br />
</h2>
<h2>MWT</h2>
<p>Micro Window
Toolkit(MWT)是一个用于开发<a onclick="javascript:tagshow(event, 'J2ME');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>J2ME</strong>
</span>
</a>
用户界面(UI)的工具包。它具有友好，强大，快速，<a onclick="javascript:tagshow(event, '%BF%AA%D4%B4');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>开源</strong>
</span>
</a>
等特性。因为它的"灵感"来自
AWT，Swing和SWT。可以使用bitmap fonts等来自定义组件。它专门为嵌入式开发而设计和优化。基于LGPL发布。<br />
<span style="display: none;">K[Lr%sRI3</span>
项目地址：<a href="http://j2me-mwt.sourceforge.net/" target="_blank">http://j2me-mwt.sourceforge.net/</a>
</p>
<p><a href="http://j2me-mwt.sourceforge.net/" target="_blank"><br />
<span style="display: none;">	V4TD6Y.n3?h*H3</span>
</a>
</p>
<table align="center" border="0">
    <tbody>
        <tr>
            <td class="title" colspan="4">1 - J2ME Desktop:</td>
        </tr>
        <tr>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo1-1.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo1-2.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo1-3.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo1-4.png" alt="" title="点击图片可在新窗口打开" />
            </td>
        </tr>
        <tr>
            <td colspan="4">Download the<a href="http://j2me-mwt.sourceforge.net/demos/demo1.jad">Jad</a>
            and<a onclick="javascript:tagshow(event, 'Jar');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>Jar</strong>
            </span>
            </a>
            or view it with<a href="http://webstart.mpowerplayer.com/j2me-mwt.sourceforge.net/demos/demo1.jad.jnlp">Java WebStart</a>
            </td>
        </tr>
    </tbody>
</table>
<br />
<span style="display: none;">$?i6_7iPGl3U~3</span>
<table align="center" border="0">
    <tbody>
        <tr>
            <td class="title" colspan="4">2 - ELP ~ RPG:</td>
        </tr>
        <tr>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo2-1.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo2-2.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo2-3.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo2-4.png" alt="" title="点击图片可在新窗口打开" />
            </td>
        </tr>
        <tr>
            <td colspan="4">Download the<a href="http://j2me-mwt.sourceforge.net/demos/demo2.jad">Jad</a>
            and<a href="http://j2me-mwt.sourceforge.net/demos/demo2.jar">Jar</a>
            or view it with<a href="http://webstart.mpowerplayer.com/j2me-mwt.sourceforge.net/demos/demo2.jad.jnlp">Java WebStart</a>
            </td>
        </tr>
    </tbody>
</table>
<br />
<span style="display: none;">JZCQYxT3</span>
<table align="center" border="0">
    <tbody>
        <tr>
            <td class="title" colspan="4">3 - Progress Bar:</td>
        </tr>
        <tr>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo3-1.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo3-2.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo3-3.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo3-4.png" alt="" title="点击图片可在新窗口打开" />
            </td>
        </tr>
        <tr>
            <td colspan="4">Download the<a href="http://j2me-mwt.sourceforge.net/demos/demo3.jad">Jad</a>
            and<a href="http://j2me-mwt.sourceforge.net/demos/demo3.jar">Jar</a>
            or view it with<a href="http://webstart.mpowerplayer.com/j2me-mwt.sourceforge.net/demos/demo3.jad.jnlp">Java WebStart</a>
            </td>
        </tr>
    </tbody>
</table>
<span style="display: none;">3GEYEV/[+_Q?"D[N6i</span>
<br />
<table align="center" border="0">
    <tbody>
        <tr>
            <td class="title" colspan="4">4 - Messenger Interface:</td>
        </tr>
        <tr>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo4-1.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo4-2.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo4-3.png" alt="" title="点击图片可在新窗口打开" />
            </td>
            <td><img style="cursor: pointer;" src="http://j2me-mwt.sourceforge.net/img/demo4-4.png" alt="" title="点击图片可在新窗口打开" />
            </td>
        </tr>
        <tr>
            <td colspan="4">Download the<a href="http://j2me-mwt.sourceforge.net/demos/demo4.jad">Jad</a>
            and<a href="http://j2me-mwt.sourceforge.net/demos/demo4.jar">Jar</a>
            or view it with<a href="http://webstart.mpowerplayer.com/j2me-mwt.sourceforge.net/demos/demo4.jad.jnlp">Java WebStart</a>
            </td>
        </tr>
    </tbody>
</table>
<h1>J4ME-开源的UI Logger 项目</h1>
<p>J4ME
是一个J2ME应用程序开发包。它包括一个UI框架，一个日记框架用于帮助调试因不同品牌<a onclick="javascript:tagshow(event, '%CA%D6%BB%FA');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>手机</strong>
</span>
</a>
的差异而产生的问题，一个蓝牙GPS框架让你能够利
用JSR-179 Location
API接口从蓝牙GPS设备获取定位信息和一个Java类包其中包含了J2ME中没有的方法比如双精度型数字的计算等。<br />
<span style="display: none;">a7Oi6k^Z	u3</span>
<a rel="lightbox" href="http://www.kaiyuan8.org/upload/2008/2/ui.gif" title="ui.gif"><img id="urn:zoundry:jid:ui.gif" src="http://www.kaiyuan8.org/upload/2008/2/ui_tn.jpg" alt="ui.gif" title="ui.gif" border="0" height="170" width="140" />
</a>
<a rel="lightbox" href="http://www.kaiyuan8.org/upload/2008/2/logging.gif" title="logging.gif"><img id="urn:zoundry:jid:logging.gif" src="http://www.kaiyuan8.org/upload/2008/2/logging_tn.jpg" alt="logging.gif" title="logging.gif" border="0" height="170" width="140" />
</a>
<a rel="lightbox" href="http://www.kaiyuan8.org/upload/gps.gif" title="gps.gif"><img id="urn:zoundry:jid:gps.gif" src="http://www.kaiyuan8.org/upload/2008/2/gps_tn.jpg" alt="gps.gif" title="gps.gif" border="0" height="174" width="140" />
</a>
</p>
<h1>OpenBaseMovil</h1>
<p><span style="display: none;">3GEYE6ct|I\</span>
<br />
BaseMovil是一个J2ME应用程序开发框架。它由多个比较独立类库组成包括：<span style="display: none;">3GEYEJsTH$m"V,m
a+y0|K</span>
<br />
OpenBaseMovil-core：整个框架的底层<a onclick="javascript:tagshow(event, '%BB%F9%B4%A1');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>基础</strong>
</span>
</a>
类库，它主要提供<a onclick="javascript:tagshow(event, '%B9%FA%BC%CA%BB%AF');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>国际化</strong>
</span>
</a>
支持、任务控制、加密、压缩、浮点支持、properties文件支持、一个MVC框架、一个事件框架。<span style="display: none;">3GEYEXO3L0@C$z
M8E</span>
<br />
OpenBaseMovil-db：一个关系型<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>数据库</strong>
</span>
</a>
引擎，其中一个表格存储的数据可上千。<span style="display: none;">3GEYE1]
m$?/vE|1@</span>
<br />
OpenBaseMovil-script：一个<a onclick="javascript:tagshow(event, '%BD%C5%B1%BE');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>脚本</strong>
</span>
</a>
引擎。<span style="display: none;">3GEYE2\G:rVA7Ez</span>
<br />
OpenBaseMovil-ui：一个UI工具包。<br />
<span style="display: none;">C,h~%O2B|3</span>
这个几类库都能够完全集成在一起使用。<span style="display: none;">3GEYEotaZ5J</span>
<br />
<a rel="lightbox" href="http://www.kaiyuan8.org/upload/2008/2/OpenBaseMovil.jpg" title="OpenBaseMovil.jpg"><img id="urn:zoundry:jid:OpenBaseMovil.jpg" src="http://www.kaiyuan8.org/upload/2008/2/OpenBaseMovil_tn.jpg" alt="OpenBaseMovil.jpg" title="OpenBaseMovil.jpg" border="0" height="200" width="169" />
</a>
<br />
<span style="display: none;">+m'^1V[1L&amp;Q7L3</span>
<a href="http://www.openbasemovil.org/" target="_blank">http://www.openbasemovil.org/</a></p>
<h1>J2ME <a onclick="javascript:tagshow(event, '%D3%CE%CF%B7');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>游戏</strong>
</span>
</a>
脚本引擎/J2me <a onclick="javascript:tagshow(event, 'game');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>game</strong>
</span>
</a>
script engine</h1>
<p>一个非常小的script脚本引擎，可以同时在j2me / j2se / c++ platform上面运行<span style="display: none;">3GEYELBXR[-CR</span>
<br />
它的目标是使用这个脚本引擎便于开发一个更加灵活的j2me 游戏。<br />
<span style="display: none;">(FQ(wY$\N�{PsW3</span>
这个脚本有点像BASIC</p>
<p>这东西不错，是一个开源的脚本引擎，大家可以学习里面的思想<span style="display: none;">3GEYE-v
r.Ps!_+da[</span>
<br />
里面其中带了一个例子，是3子棋。感觉挺不错的。这东西在SF也挺活跃的。</p>
<p><a href="http://sourceforge.net/projects/j2megamescript/">http://sourceforge.net/projects/j2megamescript/</a>
</p>
<p>例子图片<a href="http://www.3geye.net/batch.download.php?aid=23" target="_blank"><img id="urn:zoundry:jid:3_200710301619291.jpg" src="http://www.kaiyuan8.org/upload/2008/2/3_200710301619291_tn.jpg" alt="3_200710301619291.jpg" title="3_200710301619291.jpg" height="200" width="155" />
</a>
</p>
<h2>Y!Go</h2>
<p>Y!Go这是一个Yahoo Messenger J2ME客户端。</p>
<p><a href="http://ygo.sourceforge.net/">http://ygo.sourceforge.net/</a>
</p>
<h2>EBookME</h2>
<p>EBookME是一个用于把导入的文本<a onclick="javascript:tagshow(event, '%CE%C4%BC%FE');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>文件</strong>
</span>
</a>
(HTML,DOC,PDF,&#8230;)生成J2ME电子书籍格式(JAD,JAR)的Java程序。生成的<a onclick="javascript:tagshow(event, '%B5%E7%D7%D3%CA%E9');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>电子书</strong>
</span>
</a>
籍可以在支持MIDP1.0的手机上阅读。</p>
<p><a href="http://ebookme.sourceforge.net/">http://ebookme.sourceforge.net/</a>
</p>
<h2>jMobileCore</h2>
<p>jMobileCore
包是一个强大的工具用来开发J2ME应用程序.jMobileCore提供支持开发简洁的，基于Canvas的<a onclick="javascript:tagshow(event, '%CD%BC%D0%CE');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>图形</strong>
</span>
</a>
用户接口，快速地数据访问，可靠地通
信,简化多线程midlet应用程序。jMobileCore包可工作在任何支持J2ME (MIDP1.0
和CLDC1.0)的移动电话与PDA设备.</p>
<p><a href="http://jmobilecore.sourceforge.net/">http://jmobilecore.sourceforge.net/</a>
</p>
<p>还有超级经典的J2ME-POLISH</p>
<p><a href="http://www.j2mepolish.org/" target="_blank">http://www.j2mepolish.org</a>
</p>
<h2>J2ME <a onclick="javascript:tagshow(event, 'Polish');" href="javascript:;" target="_self"><span style="text-decoration: underline;"><strong>Polish</strong>
</span>
</a>
2.0</h2>
<p style="margin: 0pt;"><a href="http://www.j2mepolish.org/download.html" target="_blank"><img src="http://www.j2mepolish.org/cms/uploads/RTEmagicC_304e2c44c8.gif.gif" alt="J2ME Polish 2.0 Release Candidate is here!" height="400" width="400" />
</a>
</p>
<table border="0">
    <tbody>
        <tr>
            <td>
            <p style="margin: 0pt;"><a href="http://www.j2mepolish.org/screenshots.html" target="_blank" class="imageLink"><img src="http://www.j2mepolish.org/cms/uploads/RTEmagicC_8ed5a6da16.png.png" alt="design example 1" height="181" width="137" />
            </a>
            </p>
            </td>
            <td>
            <p style="margin: 0pt;"><a href="http://www.j2mepolish.org/screenshots.html" target="_blank" class="imageLink"><img src="http://www.j2mepolish.org/cms/uploads/RTEmagicC_aaf5623ebb.png.png" alt="design example 2" height="181" width="135" />
            </a>
            </p>
            </td>
            <td>
            <p style="margin: 0pt;"><a href="http://www.j2mepolish.org/screenshots.html" target="_blank" class="imageLink"><img src="http://www.j2mepolish.org/cms/uploads/RTEmagicC_16f133bc5f.png.png" alt="design example 3" height="181" width="137" />
            </a>
            </p>
            </td>
        </tr>
    </tbody>
</table><img src ="http://www.blogjava.net/gooogle/aggbug/191876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-10 15:20 <a href="http://www.blogjava.net/gooogle/archive/2008/04/10/191876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给你的程序加上菜单 </title><link>http://www.blogjava.net/gooogle/archive/2008/04/04/190837.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Fri, 04 Apr 2008 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/04/190837.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/190837.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/04/190837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/190837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/190837.html</trackback:ping><description><![CDATA[<strong>关键字</strong>: wince
<div class="blog_content">
<p>原文 <a href="http://www.3geye.net/?3/viewspace-3235">http://www.3geye.net/?3/viewspace-3235</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
给WinCE程序加上菜单的功能。<br />
<span style="display: none;">_M.S8G8GAAq3</span><br />
<span style="display: none;">"e+?U2SKLg9e3WR9H3</span>&nbsp; public void createMainMenu()<br />
<span style="display: none;">:P9~;qK9`+e
@3</span>&nbsp;&nbsp;&nbsp; {<br />
<span style="display: none;">#X.ovClyE
a3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // <a href="javascript:;" target="_self" onclick="javascript:tagshow(event, 'Create');"><u><strong>Create</strong></u></a> an empty MainMenu.<br />
<span style="display: none;">HQ�QdOK
n3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainMenu mainMenu = new MainMenu();<br />
<span style="display: none;">[:W&amp;r)VgIG3</span><span style="display: none;">3GEYE%O)\g)kZ8V2c s/x~</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuItem menu = new MenuItem();<span style="display: none;">3GEYE(f;uJ7DQ</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="display: none;">3GEYE`EF-G4z\</span><br />
<br />
<span style="display: none;">i;W9T
U
s&amp;\
m)rs3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menu.Text = "菜单";<br />
<span style="display: none;">~:X,Nj:M3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuItem menuItem = new MenuItem();<span style="display: none;">3GEYE$R3[wGR*Q</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuItem.Text = "打开网页";<span style="display: none;">3GEYE)U0KP*h,k5mRog</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menu.MenuItems.Add(menuItem);<span style="display: none;">3GEYE
x^Tip/j2X</span><br />
<span style="display: none;">3GEYE]#w1F!|:^-b kc</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuItem = new MenuItem();<br />
<span style="display: none;">v"m,@9D3P"{�u\Z.s3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuItem.Text = "源代码";<br />
<span style="display: none;">L'y5|FT7J#MD1vo9h3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menu.MenuItems.Add(menuItem);<span style="display: none;">3GEYE8q,n
[cI
wR.Z+_5M</span><br />
<span style="display: none;">3GEYE
atI
bNi</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuItem = new MenuItem();<br />
<span style="display: none;">cwV3l/p:U#Pdw!R3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuItem.Text = "退出";<br />
<span style="display: none;">x)Ff%UO9c.A3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menu.MenuItems.Add(menuItem);<br />
<span style="display: none;">H/U CgzG.mw3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
<span style="display: none;">K^A"A)E3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add two MenuItem objects to the MainMenu.<span style="display: none;">3GEYE9MY
I
c3Pl$a</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainMenu.MenuItems.Add(menu);<span style="display: none;">3GEYE%E6A]I*t*oTj_</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
<span style="display: none;">6P1S-?7J9B-Do3</span><span style="display: none;">3GEYE"}Mdl"n1ci:y</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Bind the MainMenu to Form1.<br />
<span style="display: none;">	D%G]3_,`1o3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Menu = mainMenu;<br />
<span style="display: none;">h
sT;w2l;b'I(c|;f3</span>&nbsp;&nbsp;&nbsp; }<br />
<span style="display: none;">Cc0[E3L|?d(t3</span>&nbsp;&nbsp; &nbsp;<br />
<span style="display: none;">5WH1X/v1t3</span>&nbsp;&nbsp; &nbsp;<br />
<span style="display: none;">^~7nB~*j3</span>&nbsp;&nbsp;&nbsp; 感觉微软的东西就是简单。 </p>
</div><img src ="http://www.blogjava.net/gooogle/aggbug/190837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-04 23:04 <a href="http://www.blogjava.net/gooogle/archive/2008/04/04/190837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于解决了Mibole C# 闪烁问题</title><link>http://www.blogjava.net/gooogle/archive/2008/04/04/190835.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Fri, 04 Apr 2008 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/04/190835.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/190835.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/04/190835.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/190835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/190835.html</trackback:ping><description><![CDATA[<p>原文：&nbsp;&nbsp; <a mce_href="http://www.3geye.net/?3/viewspace-3234" href="http://www.3geye.net/?3/viewspace-3234">http://www.3geye.net/?3/viewspace-3234</a></p>
<p>&nbsp; </p>
昨天晚上试验了下，发现双缓冲来是不起作用，很是郁闷。怎么办了，今天看了一篇文章才恍然大悟。。<span style="display: none;">3GEYE|Q~@$` PS,c</span><br />
<span style="display: none;">3GEYE7t_a6M`#c)I$|E</span><br />
我想你看了这篇文章也是很容易理解的。<span style="display: none;">3GEYE_�r�nP ]*@ ?</span><br />
<br />
<span style="display: none;">5A3]3G�S9B�`u3</span>下面是叶帆的一篇文章点醒了我。<span style="display: none;">3GEYE;Q,hc
S5b2\)c ua</span><br />
<br />
<span style="display: none;">1}%~@`	g2f3</span><a href="http://blog.csdn.net/yefanqiu/archive/2006/11/21/1402520.aspx" mce_href="http://blog.csdn.net/yefanqiu/archive/2006/11/21/1402520.aspx">&nbsp;WinCE 4.2（.net精简框架集）下的</a><a onclick="return true;javascript:tagshow(event, '%CD%BC%D0%CE');" href="javascript:;" mce_href="javascript:;" target="_self"><u><strong>图形</strong></u></a>双缓存处理&nbsp;&nbsp;<span><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star_half.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star_half.gif" alt="" title="点击图片可在新窗口打开" border="0" /></span>&nbsp;&nbsp;<img src="http://blog.csdn.net/images/ask.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/ask.gif" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" title="点击图片可在新窗口打开" border="0" /><span><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star.gif" alt="" title="点击图片可在新窗口打开" border="0" /><img src="http://blog.csdn.net/images/star_half.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/star_half.gif" alt="" title="点击图片可在新窗口打开" border="0" /></span>&nbsp;&nbsp;<img src="http://blog.csdn.net/images/ask.gif" style="cursor: pointer;" mce_src="http://blog.csdn.net/images/ask.gif" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" title="点击图片可在新窗口打开" border="0" />
<div class="postText">
<p><span size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上位机Windows操作平台（ .net 2.0框架集）下实现图形双缓存有很多办法，每种办法在上位机都有很好的效果，但是很不幸，在WinCE4.2操作系统（.net 2.0精简框架集）下这些方法要么不支持，要么效果很差（还是闪烁的厉害）。</span></p>
<p><span size="2">在上位机中，一般都有这么几种办法：</span></p>
<p><span size="2">1、<span color="black" face="宋体" style="font-size: 10pt;"><span face="Arial"><a onclick="return true;javascript:tagshow(event, '%D3%A6%D3%C3%B3%CC%D0%F2');" href="javascript:;" mce_href="javascript:;" target="_self"><u><strong>应用程序</strong></u></a>中使用双缓冲的最简便的方法是使用<span>.NET Framework</span>为窗体和控件提供的默认双缓冲，通过将<span>DoubleBuffered</span>属性设置为True即可。</span></span></span></p>
<p><span color="black" face="宋体" style="font-size: 10pt;"><span face="Arial">2、通过SetStyle修改控件属性。</span></span></p>
<p><span color="black" face="宋体" style="font-size: 10pt;">&nbsp;<span color="#000066" style="font-size: 13.5pt;">public void EnableDoubleBuffering()</span></span></p>
<p><span color="black" face="宋体" style="font-size: 10pt;"><span color="#000066" style="font-size: 13.5pt;">{</span></span></p>
<div style="margin: 0cm 0.75pt 0pt; text-align: left;" align="left"><span color="#000066" style="font-size: 13.5pt;">&nbsp;&nbsp; // Set the value of the double-buffering style bits to true.</span></div>
<div style="margin: 0cm 0.75pt 0pt; text-align: left;" align="left"><span color="#000066" style="font-size: 13.5pt;">&nbsp;&nbsp; this.SetStyle(ControlStyles.DoubleBuffer |</span></div>
<div style="margin: 0cm 0.75pt 0pt; text-align: left;" align="left"><span color="#000066" style="font-size: 13.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ControlStyles.UserPaint |</span></div>
<div style="margin: 0cm 0.75pt 0pt; text-align: left;" align="left"><span color="#000066" style="font-size: 13.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ControlStyles.AllPaintingInWmPaint,</span></div>
<div style="margin: 0cm 0.75pt 0pt; text-align: left;" align="left"><span color="#000066" style="font-size: 13.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true);</span></div>
<div style="margin: 0cm 0.75pt 0pt; text-align: left;" align="left"><span color="#000066" style="font-size: 13.5pt;">&nbsp;&nbsp; this.UpdateStyles();</span></div>
<p><span color="#000066" style="font-size: 13.5pt;">}</span></p>
<p><span color="#000066" style="font-size: 13.5pt;"><span face="Arial" size="2">3、比较经典的一种如下：重载<span color="#000000" face="Verdana">OnPaint函数</span></span></span></p>
<span color="#000066" style="font-size: 13.5pt;">
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span size="2"><span color="#000000"><span face="Verdana">protected override void OnPaint(PaintEventArgs e)<br />
<span style="display: none;">|'B:lM�k wCg3</span>&nbsp;&nbsp;{<span style="display: none;">3GEYE�P(i#A$z9U].E#W</span><br />
<br />
<span style="display: none;">a%r4Et:B)o^[-_F3</span>&nbsp;&nbsp;&nbsp;System.Drawing.Bitmap b = new Bitmap(this.Width,this.Height);//</span><span>双缓冲技术</span><span face="Verdana">,</span><span>先将所有要画的画在该图片中</span><span face="Verdana">,</span><span>再调用</span><span face="Verdana">GS</span><span>画出该图片</span></span></span><span face="Verdana"><span size="2"><span color="#000000">.<br />
<span style="display: none;">"i-~/I-F
Nu3</span>&nbsp;&nbsp;&nbsp;Graphics g = Graphics.FromImage((System.Drawing.Image)b);<br />
<span style="display: none;">~)O~|0Q5OA4Yr3</span>&nbsp;&nbsp;&nbsp;//</span></span></span><span size="2"><span color="#000000"><span>在这里画你所需要画的</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp; //-------------------<span style="display: none;">3GEYE7Exk9V
d%eR:Toj</span><br />
&nbsp;&nbsp;&nbsp;e.Graphics.DrawImage((System.Drawing.Image)b,0,0);<br />
<span style="display: none;">RX$ZE'F3</span>&nbsp;&nbsp;&nbsp;g.Dispose();</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp; base.OnPaint (e);&nbsp;&nbsp;&nbsp;<br />
<span style="display: none;">	S	OxLI-`3</span>&nbsp;&nbsp;}</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; 前两种办法在WinCE下都不支持，第三种办法是可以使用的，但效果不佳，还是有明显的闪烁现象。经过上网查资料和测试，发现在第三种办法<a onclick="return true;javascript:tagshow(event, '%BB%F9%B4%A1');" href="javascript:;" mce_href="javascript:;" target="_self"><u><strong>基础</strong></u></a>上要进行如下处理，效果才非常完美。</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp; 由于我是在Panel上绘的图，所以我派生了一个类EmbedPanel，重载了OnPaintBackground函数，并且置该函数为空。<span style="display: none;">3GEYE&amp;W-}XFjr~+n</span><br />
</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp;&nbsp; public class EmbedPanel : Panel<span style="display: none;">3GEYE_XPJey%LIg</span><br />
&nbsp;&nbsp;&nbsp; {<br />
<span style="display: none;">&amp;vkt%ZXW�xJ_3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override void OnPaintBackground(PaintEventArgs paintg)<br />
<span style="display: none;">zb1vSH-^%[%o*P3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="display: none;">3GEYE2L.FtJlIZ R</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不绘制背景<span style="display: none;">3GEYE w,ki
@:Zz</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<span style="display: none;">3GEYE"iyM+y\'Un</span><br />
&nbsp;&nbsp;&nbsp; }&nbsp;</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp; &nbsp;private void pb_Paint(object sender, PaintEventArgs e)<br />
<span style="display: none;">BpM\BR|3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<span style="display: none;">n	]{,g8v*u$d
D/YEO3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<span style="display: none;">3GEYE/W
kf,M+N$o$W</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<span style="display: none;">3GEYEL6f}wr2_2t</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pb_Graphics.FillRectangle(new SolidBrush(BackColor), Rect);&nbsp; //绘制背景<br />
<span style="display: none;">R'?/R0jx	yh/k6W]3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //--------------------------------------------------------</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... ... 具体的绘图代码</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //--------------------------------------------------------<br />
<span style="display: none;">:?6@&amp;}	JjcM3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.Graphics.DrawImage((System.Drawing.Image)pb_Bitmap, 0, 0);<span style="display: none;">3GEYEKpi�sk,T6?w</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<span style="display: none;">'RdyC.W Z.]3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception err)<span style="display: none;">3GEYEpO�jUm-?6Z</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<span style="display: none;">"K
z|-k
Mj$AB~$W\3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowInfo(3000, 2, err.Message, "pb_Paint");<br />
<span style="display: none;">-CSXP[3B)g,b3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<span style="display: none;">3GEYEU,k*|9R7@4_'N cw</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp;&nbsp;
//注：在WINCE测试时发现，在OnPaint中的写System.Drawing.Bitmap b = new
Bitmap(this.Width,this.Height)代码，程序运行不长时间便会导致WinCE死机。所以我是在类的初始化中执行该代码的。</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"><span size="2"><span color="#000000">&nbsp;&nbsp;&nbsp;&nbsp; 这样一来，就很完美的在.net精简框架集下解决了绘图闪烁问题。</span></span></span></p>
<p style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span face="Verdana"></span></p>
<p>&nbsp;</p>
</span><span style="display: none;">3GEYE}]m
h qx</span><br />
<br />
<span style="display: none;">/Ym{/zC9f#j3</span>
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1402520</p>
</div>
<span style="display: none;">3GEYEg*kGS*p/~B</span>
<p>&nbsp;</p><img src ="http://www.blogjava.net/gooogle/aggbug/190835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-04 22:22 <a href="http://www.blogjava.net/gooogle/archive/2008/04/04/190835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>公告：博客搬家了到http://wuhua.3geye.net</title><link>http://www.blogjava.net/gooogle/archive/2008/04/01/189917.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Tue, 01 Apr 2008 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/01/189917.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/189917.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/01/189917.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/189917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/189917.html</trackback:ping><description><![CDATA[如题，<br />
以后我个主要维护的博客是<br />
<a href="http://wuhua.3geye.net">http://wuhua.3geye.net</a><br />
<br />
里面有大量的移动开发文章已经相关经验，请大家多多来访。还有大量的源代码下载。实例解说。<br />
<br />
来吧，一起体验移动开发吧。这很有趣。<br />
<br /><img src ="http://www.blogjava.net/gooogle/aggbug/189917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-01 09:34 <a href="http://www.blogjava.net/gooogle/archive/2008/04/01/189917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME内存优化 【转】+ 补充</title><link>http://www.blogjava.net/gooogle/archive/2008/04/01/189914.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Tue, 01 Apr 2008 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/04/01/189914.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/189914.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/04/01/189914.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/189914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/189914.html</trackback:ping><description><![CDATA[<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">原文<a href="http://www.3geye.net/?3/viewspace-3215"> http://www.3geye.net/?3/viewspace-3215</a><br />
out momory
一阵天旋地转内存又溢出了。在<a href="javascript:;" onclick="javascript:tagshow(event, '%CA%D6%BB%FA');" target="_self"><u><strong>手机</strong></u></a>上这种痛苦经常都有，套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K
来记,可能某位同志会马上跳出来说也有上M的，记住中国还不富大多数手机都是低端手机。写手机程序让我仿佛回到了dos时代（自我安慰一下那个时代也炼出
了不少高手说不定我是下一个）。言归正传做内存优化可以归结为以下几种方法。代码优化，图片优化，第三方工具优化等&#8230;<br />
<span style="display: none;">3^N9RfBLC�i%Wpe)h3</span><strong>一．代码优化</strong><br />
<span style="display: none;">D/MX)T5J3</span>内存会溢出肯定和代码逃不了关系,99.99%学<a href="javascript:;" onclick="javascript:tagshow(event, 'java');" target="_self"><u><strong>java</strong></u></a>的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不
少事，但这个特性却带来了不少隐患。举个例子在<a href="javascript:;" onclick="javascript:tagshow(event, '%D3%CE%CF%B7');" target="_self"><u><strong>游戏</strong></u></a>当中经常有不同场景的切换，如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃
圾回收器来收尸^_^。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,它不像C++的Delete语句马上释放不用的内存。当从
游戏逻辑切换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。读到这里很多人会发现实际上垃圾回收器在<u><strong><font color="#ff0000"><a href="javascript:;" onclick="javascript:tagshow(event, 'j2me');" target="_self"><u><strong>j2me</strong></u></a></font></strong></u>上并不怎么好用，从一个角度上来讲在<u><strong><font color="#ff0000">j2me</font></strong></u>上
所有垃圾必须由手工释放,除简单类型以外所有对象都必须显式地置空例如
imgs=null;&nbsp;&nbsp;实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory()
。它可以返回当前的剩余内存数，将它适当的安放在代码中可以有效的监测内存使用状况。很大一部份的<u><strong><font color="#ff0000">j2me</font></strong></u><a href="javascript:;" onclick="javascript:tagshow(event, '%B3%CC%D0%F2%D4%B1');" target="_self"><u><strong>程序员</strong></u></a>之前都是从事pc软件开发工作，充裕的内存掩盖了许多写代码的不良习惯。如下所示:<br />
<span style="display: none;">0Lh}Ck\OW)w7k7Ae3</span>&nbsp; &nbsp;&nbsp;&nbsp;//a 不为空<span style="display: none;">3GEYE.|�@:R1cc*|xo</span><br />
&nbsp; &nbsp;&nbsp;&nbsp;a=new Logic();<br />
<span style="display: none;">*f2WZ3hKxx3</span>很多人可能对此有异议，他们会认为新的对象会把旧的对象冲掉并且释放内存。这里面包含两个问题：1. 该段代码是先创建对象然后再进行赋值操作的，也就是说在这期间有两个对象同时存在这就很可能会产生溢出。2. 这样做也会妨碍垃圾回收器的工作<span style="display: none;">3GEYE.f_I(Xd</span><br />
较好的写法如下:<br />
<span style="display: none;">;N
Y.|;aL!h
F#f3</span>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;a=null;<br />
<span style="display: none;">K0JX*^%\0nRlg3</span>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;a=new Logic();<span style="display: none;">3GEYEq0fbp.B4_
ON%u</span><br />
虽然麻烦了点但在<u><strong><font color="#ff0000">j2me</font></strong></u>中还是必要的。接着看下例。<br />
<span style="display: none;">eA&amp;gdL~Z3</span>&nbsp;&nbsp;drawString("游戏时间:" + time ,50,50,Graphics.LEFT|Graphics.TOP);<span style="display: none;">3GEYEa	dhO'Z?</span><br />
"游戏时间:" +
time&nbsp;&nbsp;很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在美丽的外表，该语句会引起新的内存重新分配来存储
"游戏时间:" + time&nbsp;
&nbsp;而显示完以后又必须由垃圾回收器释放，用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法
类似在循环里也有类似的情况存在。<br />
<span style="display: none;">'Pc_\5\X3</span>把所有对象的初始化放在构造函数里想必是再正当不过了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。<span style="display: none;">3GEYEV J^/_&amp;?5L2~5B</span><br />
很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示<span style="display: none;">3GEYE+i1Bk;NK^(p;o</span><br />
&nbsp; &nbsp; if (img==null){<br />
<span style="display: none;">#wg'\1gs5I3</span>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//初始化<span style="display: none;">3GEYE0\O6wQ
V$rY5I</span><br />
&nbsp; &nbsp; }<br />
<span style="display: none;">7l4~0\7bUf3</span>现在做游戏很多时候都需要地图数组，<a href="javascript:;" onclick="javascript:tagshow(event, '%C9%F9%D2%F4');" target="_self"><u><strong>声音</strong></u></a>数组，还有一些其它资源这些资源很多可以放在代码中也有的可以放在<a href="javascript:;" onclick="javascript:tagshow(event, '%CE%C4%BC%FE');" target="_self"><u><strong>文件</strong></u></a>当中。<br />
<span style="display: none;">)An0uK!R.Q/Ce$\3</span>强烈建议将这些资源放在文件中需要时在load进来。这些资源文件如果放在代码中则会占用不小的代码段空间，而代码一般是程序一运行就装载到内存当中。<br />
<span style="display: none;">)Olj6Q)Y'@7vD*E!I(k3</span>除上面列举的方法外还有一些大家所熟知的顺便一提, 比如关闭没用的<a href="javascript:;" onclick="javascript:tagshow(event, 'rms');" target="_self"><u><strong>rms</strong></u></a> ，关闭没用的网络连接，关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法，无论在代码调式，内存释放都可以做到非常清析。<span style="display: none;">3GEYEWp%_ nmRx</span><br />
<strong>二. 图片优化</strong><span style="display: none;">3GEYE9u4aL)|D
]/W</span><br />
<u><strong><font color="#ff0000">j2me</font></strong></u>的内存杀手无疑非图片莫属,一张3k的图片可以占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。<br />
<span style="display: none;">-W-O8FIApm3</span>1．图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为"，而是选择 "存储为
<a href="javascript:;" onclick="javascript:tagshow(event, 'web');" target="_self"><u><strong>web</strong></u></a> 所用格式"&nbsp;&nbsp;可以根据里面的选项进行压缩，特别是颜色这一项越小越好不过相应的图像会有所失真。不要认为这样就完了。<span style="display: none;">3GEYE	~P@pw,^</span><br />
实际上该图片还可以再次压缩，在网上有许多类似的工具。推荐一款可以压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。<br />
<span style="display: none;">x2Vz\D L)Y8^-rW@8q3</span>&nbsp; &nbsp;&nbsp;&nbsp;假如你有多张规格一样的图片，那么建议你把它做成一张长条图片。有两个原因：<br />
<span style="display: none;">:bw-N ?1H[r]3</span>1、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。<span style="display: none;">3GEYE.~
b7C~c]9R-V Lf</span><br />
2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张，吱地一声内存又溢出了...原因想必大家也知道!！图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。<span style="display: none;">3GEYE"YGAg1r$L</span><br />
作图时还有一些细节需要注意,颜色数量，分辩率，图像模式（最好是索引颜色),画布大小都会影响到图片大小。<span style="display: none;">3GEYEC%}~�\`,N"bQ</span><br />
<strong>三． 工具优化</strong><span style="display: none;">3GEYE0{.^:w|.ZhDn}</span><br />
谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商）。实际上用它来优化程序也是不错的选择，至少有两点好处：1、
压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳，多少超过64k限制的游戏都受过它的恩惠；
2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。<br />
<span style="display: none;">1Uz#ioJ:r3</span>根据经验很多人都会用jb自带的混淆器RetroGuard，实际上它效果并不怎么好。推荐使用proguard 在<a href="http://sf.net/" target="_blank">http://sf.net</a>可以免费下载，它可以比retroguard 多压缩3至4 k 以上而且安全性更好。<span style="display: none;">3GEYEGR!MC[I</span><br />
<br />
<span style="display: none;">$wY:hhF|3</span><span style="font-weight: bold;">四。补充说明</span><span style="display: none;">3GEYEV'G?)h
E#f?e</span><br />
对于可以从网络下载的资源，尽量通过网络下载数据，这样也可以减少<a href="javascript:;" onclick="javascript:tagshow(event, 'jar');" target="_self"><u><strong>jar</strong></u></a>的大小。<span style="display: none;">3GEYE(ao&amp;h
[#r</span><br />
对于大量运算需要保持很多数据的结果，最后通过RMS作为缓冲来实现，比如你保存一些计算结果到rms中，特别是一些字符串的操作，有些数据可能有几十k，你保存到rms中，就相当于节省了几十k的数据了。<br />
<span style="display: none;">6_e%\;f8v'^0pn
j3</span><span style="display: none;">3GEYE?_ _a}B
G:BV</span><br />
对于用字符串来保存状态的，可以用byte来保存那就更好了。<span style="display: none;">3GEYE-Hx,MQ,~BfP+Y</span><br />
避免采用大对象。比如加载超过过几十k，甚至是上百k的字符串，或者是图片<br />
<span style="display: none;">I&amp;TKd9r3</span>for(int i=0 ;i&lt;100000;i++){<span style="display: none;">3GEYEtG5_'Gom1P</span><br />
&nbsp;&nbsp; s += "sdfdsf";<br />
<span style="display: none;">NdV7o1Cf'jpf3</span>}<span style="display: none;">3GEYE#W%_5Y.eW</span><br />
这样很容易出现问题。<span style="display: none;">3GEYEdi;wW4`-~5Z"y3p!Z</span><br />
因为s是一块连续的内存空间，搞不好就内存溢出了。<br />
<span style="display: none;">&amp;UA3WT%C{3</span></span><img src ="http://www.blogjava.net/gooogle/aggbug/189914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-04-01 09:32 <a href="http://www.blogjava.net/gooogle/archive/2008/04/01/189914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修复J2ME Game Script 的bug</title><link>http://www.blogjava.net/gooogle/archive/2008/03/30/189583.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Sun, 30 Mar 2008 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/03/30/189583.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/189583.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/03/30/189583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/189583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/189583.html</trackback:ping><description><![CDATA[原文在 <br />
<h1 class="xspace-title"><a href="http://www.3geye.net/?3/viewspace-3196" target="_blank">http://www.3geye.net/?3/viewspace-3196</a></h1>
<br />
今天在玩<a href="http://hi.baidu.com/googledev/blog/item/%20:;" target="_self"><u><strong>开源</strong></u></a>的Script的引擎的时候在解释下面script的时候出现问题，<span style="display: none;">3GEYE x _:f i ] J</span><br />
你知道为什么吗<span style="display: none;">3GEYE9}&amp;`'R$M%\ d Y&amp;a</span><br />
i = 5<span style="display: none;">3GEYE1E ^:p ` u</span><br />
j = 1232323<span style="display: none;">3GEYE M"U z B z O+A ?"w</span><br />
h = i + j<span style="display: none;">3GEYE'r X%I8P&amp;b+L</span><br />
println(h)<br />
<span style="display: none;"> N ~;A7B U5c x0G \ u3</span><span style="display: none;">3GEYE.h h#n I [ L</span><br />
抛出这个异常<span style="display: none;">3GEYE a7T m/e v"n j</span><br />
<br />
<span style="display: none;">+`)c,} k3s3</span>4 :  Illegal statment ,String index out of range: -9<span style="display: none;">3GEYE3y!r W R%? m:k m P N</span><br />
<a href="http://hi.baidu.com/googledev/blog/item/%20:;" target="_self"><u><strong>java</strong></u></a>.lang.StringIndexOutOfBoundsException: String index out of range: -9<span style="display: none;">3GEYE v0m F U x)U m</span><br />
&nbsp;&nbsp;&nbsp;  at java.lang.String.substring(Unknown Source)<br />
<span style="display: none;"> @ v&amp;w%U R,M3x.s y3</span>&nbsp;&nbsp;&nbsp;  at gscript.Interpreter.callSub(Interpreter.java:1355)<span style="display: none;">3GEYE A(k4N Q!I J G a C u</span><br />
&nbsp;&nbsp;&nbsp;  at gscript.Interpreter._sub(Interpreter.java:401)<br />
<span style="display: none;">'_ d.g [ H*I(\ G3</span>&nbsp;&nbsp;&nbsp;  at gscript.Interpreter.callSub(Interpreter.java:1353)<br />
<span style="display: none;"> a h z \ f M3</span>&nbsp;&nbsp;&nbsp;  at gscript.Interpreter.start(Interpreter.java:227)<br />
<span style="display: none;">/m/V |,v!d m;@3</span>&nbsp;&nbsp;&nbsp;  at gscript.Interpreter.start(Interpreter.java:198)<br />
<span style="display: none;"> L5|"^ E j C3</span>&nbsp;&nbsp;&nbsp;  at ScriptTest.main(ScriptTest.java:12)<br />
<span style="display: none;">(i ]*@ M S \ c,`3a%c3</span><br />
<span style="display: none;">)N6r H!`+h3</span><br />
<span style="display: none;">7R W U+h!L1Q(P3</span>后来发现原来是println(h)少了一个换行符号。<br />
<span style="display: none;"> U B g ]4b @ d J!F j5Y3</span><br />
<span style="display: none;"> U z _.s J3</span>现在我修改了下源代码。<span style="display: none;">3GEYE P M \ O#c</span><br />
我修改了下代码后，这个bug解决了<br />
<span style="display: none;"> I ^"M T.` e)B N3</span>看原来的代码<br />
<span style="display: none;"> @6}/~ v ^ h N X3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  for (int i = 0; i &lt; srcBytes.length; i++) {<span style="display: none;">3GEYE [ z&amp;G U$@)q z/s-a,C</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if (srcBytes[i] == 0x0a || i + 1 == srcBytes.length) { // 行结束,或者<a href="http://hi.baidu.com/googledev/blog/item/%20:;" target="_self"><u><strong>文件</strong></u></a>结束<span style="display: none;">3GEYE v G |'y d D</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  try {<span style="display: none;">3GEYE4U q z i,V0N z W-R</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  String s = new String(line.toByteArray()); // <a href="http://hi.baidu.com/googledev/blog/item/%20:;" target="_self"><u><strong>j2me</strong></u></a>使用<br />
<span style="display: none;">/s d K3?9T U H ^8l \/} ~3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // String s = new String(line.toByteArray(), "GB2312");<br />
<span style="display: none;">.P f H#K6B U X'e F8R3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // //j2se使用<span style="display: none;">3GEYE#O e u;Q ])S+p.M e</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  s = s.trim();<span style="display: none;">3GEYE Y,b E ? D L j O</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;<br />
<span style="display: none;"> m'j!g } g8| L3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  srcCode[lineCount++] = s;<span style="display: none;">3GEYE C7o u ~-P a</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  } catch (Exception ex1) {<br />
<span style="display: none;">#H V p3v M;V V P9|3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<span style="display: none;">3GEYE N:u t:r ]-t.U</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  line.reset();<br />
<span style="display: none;"> h p Q&amp;w x3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  } else {<span style="display: none;">3GEYE e |6D1f6x y</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  line.write(srcBytes[i]);<span style="display: none;">3GEYE R T T ]0h a</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br />
<span style="display: none;"> b r,d ^.^3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<span style="display: none;">3GEYE-{ A#x)\3z4| N</span><br />
<span style="display: none;">3GEYE p Q-g n j y g3z</span><br />
修改后的代码<span style="display: none;">3GEYE.R p,{%P5s&amp;C4Y</span><br />
<br />
<span style="display: none;">:S$N H8a R g3</span>for (int i = 0; i &lt; srcBytes.length; i++) {<br />
<span style="display: none;"> l \ f(L O%} y-Y V$L3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if (srcBytes[i] == 0x0a ) { // 行结束,或者文件结束<span style="display: none;">3GEYE:[ o Q5_ d1J1^ {</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  try {<span style="display: none;">3GEYE!y2~ L m R p B!B</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  String s = new String(line.toByteArray()); // j2me使用<br />
<span style="display: none;">&amp;~$`,Q ` u(A D*u3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // String s = new String(line.toByteArray(), "GB2312");<span style="display: none;">3GEYE E h0\/| j w X U3V</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // //j2se使用<span style="display: none;">3GEYE k1}4X S K L</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  s = s.trim();<span style="display: none;">3GEYE3s h T o#{ z b</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  //System.out.println(s);<span style="display: none;">3GEYE u i K&amp;^5_)x6m0S p m*H</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  srcCode[lineCount++] = s;<span style="display: none;">3GEYE g ]&amp;D%d P</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  } catch (Exception ex1) {<br />
<span style="display: none;"> ?%l/{,V { ^ ~ i3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br />
<span style="display: none;"> @8B J _ W c1\3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  line.reset();<br />
<span style="display: none;">8R e J&amp;J p ~ T3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  } else {<span style="display: none;">3GEYE+S p p5F D:R N6d M/E&amp;z</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  line.write(srcBytes[i]);<br />
<span style="display: none;"> M w$n6b(|;n J3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if(i + 1 == srcBytes.length){<br />
<span style="display: none;">$T9Q*C P3O(_0q3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  String s = new String(line.toByteArray()); // j2me使用<span style="display: none;">3GEYE W A4E;c x0V</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // String s = new String(line.toByteArray(), "GB2312");<span style="display: none;">3GEYE ^ O$]#j/h$C</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // //j2se使用<br />
<span style="display: none;"> U;S U n u9}3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  s = s.trim();<br />
<span style="display: none;"> }+^ ? I T q ?3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  s = s.trim();<span style="display: none;">3GEYE } k9A+P Y"x</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  //System.out.println(s);<br />
<span style="display: none;"> i [ S$Y!~3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  srcCode[lineCount++] = s;<span style="display: none;">3GEYE l U d I c I</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<span style="display: none;">3GEYE { k4~ t L</span><br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br />
<span style="display: none;">8V | h4Y({9N S v3</span>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }<br />
<br />
<span style="display: none;">9U)q9w3v6g V3</span><img src ="http://www.blogjava.net/gooogle/aggbug/189583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-03-30 11:46 <a href="http://www.blogjava.net/gooogle/archive/2008/03/30/189583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍一款Html，纯java浏览解释引擎--Cobra</title><link>http://www.blogjava.net/gooogle/archive/2008/03/28/189373.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Fri, 28 Mar 2008 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/03/28/189373.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/189373.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/03/28/189373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/189373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/189373.html</trackback:ping><description><![CDATA[原来文是：<a href="http://www.3geye.net/?3/viewspace-3195">http://www.3geye.net/?3/viewspace-3195</a><br />
Cobra是一个HTML工具包。它包含一个纯<a href="javascript:;" onclick="javascript:tagshow(event, 'Java');" target="_self"><u><strong>Java</strong></u></a> HTML DOM 分析器和一个页面表现引擎。Cobra支持HTML4,Javascript 和CSS2。<br />
<span style="display: none;">8Jms;~*S&amp;m8t;tmM(T3</span><br />
<span style="display: none;">X%C|;L8FX(nLf3</span>该项目主页:<a href="http://html.xamjwg.org/cobra.jsp">http://html.xamjwg.org/cobra.jsp</a><br />
<span style="display: none;">+s_d v/v m1z3</span><br />
<span style="display: none;">_%LD{#lEsG3</span>本人因为要逐步研究<a href="javascript:;" onclick="javascript:tagshow(event, '%E4%AF%C0%C0%C6%F7');" target="_self"><u><strong>浏览器</strong></u></a>，所以下载来看看，发现对于解释html是可以解释称DOM，但是速度慢，至于展示引擎，则表现的很差。不支持中文。<img src ="http://www.blogjava.net/gooogle/aggbug/189373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-03-28 23:19 <a href="http://www.blogjava.net/gooogle/archive/2008/03/28/189373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME 游戏脚本引擎/J2me game script engine 研究之一</title><link>http://www.blogjava.net/gooogle/archive/2008/03/27/188977.html</link><dc:creator>3G工作室</dc:creator><author>3G工作室</author><pubDate>Thu, 27 Mar 2008 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/gooogle/archive/2008/03/27/188977.html</guid><wfw:comment>http://www.blogjava.net/gooogle/comments/188977.html</wfw:comment><comments>http://www.blogjava.net/gooogle/archive/2008/03/27/188977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gooogle/comments/commentRss/188977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gooogle/services/trackbacks/188977.html</trackback:ping><description><![CDATA[原文 <a href="http://www.3geye.net/?3/viewspace-3187">http://www.3geye.net/?3/viewspace-3187</a><br />
<br />
昨天，因为工作需要想了解下脚步引擎的实现原理，下载了一个<a href="javascript:;" onclick="javascript:tagshow(event, '%BF%AA%D4%B4');" target="_self"><u><strong>开源</strong></u></a>的<a href="javascript:;" onclick="javascript:tagshow(event, '%BD%C5%B1%BE');" target="_self"><u><strong>脚本</strong></u></a>引擎，研究了下，<span style="display: none;">3GEYE^9ys.p�^.p;G!s</span><br />
如果大家需要下载的，请到我空间Google下，就可以发现这个脚本引擎的具体地址。<span style="display: none;">3GEYEX6xWl(p	Y!Cl)z1^$`</span><br />
下面我来说下这个脚本引擎的一些<a href="javascript:;" onclick="javascript:tagshow(event, '%D0%D4%C4%DC');" target="_self"><u><strong>性能</strong></u></a>问题。<br />
<span style="display: none;">![n	t*w
S`m3</span><br />
<span style="display: none;">%p6mw8VX3Qx;{ K%D5q3</span>首先来看看他是怎么读取脚本<a href="javascript:;" onclick="javascript:tagshow(event, '%CE%C4%BC%FE');" target="_self"><u><strong>文件</strong></u></a>的。<span style="display: none;">3GEYE6C~3UC
p4d8{</span><br />
<span style="display: none;">3GEYEQF)A$pt)QOG
a</span><br />
代码<br />
<span style="display: none;">;wv2zD:bP3</span><span style="display: none;">3GEYE+erGU4vzrz</span><br />
&nbsp;InputStream is = new Object().getClass().getResourceAsStream(path);&nbsp;&nbsp; //j2me使用<br />
<span style="display: none;">0}%j6Ch}V'p3</span>&nbsp;ByteArrayOutputStream baos = new ByteArrayOutputStream();<br />
<span style="display: none;">MCd,`3n
~'S(|3</span>&nbsp;int ch = 0;<br />
<span style="display: none;">8|@DzXe:m2^O3</span>&nbsp;&nbsp;&nbsp; while ( (ch = is.read()) != -1) {<span style="display: none;">3GEYE.fv`!mwn(R</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baos.write(ch);<span style="display: none;">3GEYE$l |	B8R"`jO</span><br />
}<span style="display: none;">3GEYE7{:AKw1ZF4}�j:T</span><br />
上面是作者读取脚本文件代码，本人觉得这个代码的效率很低，一个个字符读取出来，速度很慢，我测试了下发现读取一个很简单的文件需要47毫秒，在Dell 1420的机器上。这样的效率是很可怕的。<br />
<span style="display: none;">Lp�EZ:^3</span><span style="display: none;">3GEYE:vN|Ou:C1X$^</span><br />
下面看看我是怎么提高他的性能的。<br />
<span style="display: none;">"s'O3K:xW4IZ,Rm,R)I3</span><span style="display: none;">3GEYE(Gh6CO+G`</span><br />
byte[] buff = new byte[512];<span style="display: none;">3GEYE7u9]xA,?I</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; long total = 0;<span style="display: none;">3GEYEQ In|*A[1P</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int count = 0;<span style="display: none;">3GEYE	u
J?J0d</span><br />
<span style="display: none;">3GEYEQ%fNX"|9W3JB</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((count = is.read(buff)) &gt; 0) {<br />
<span style="display: none;">*@)teb6P)df&amp;e+r3</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; baos.write(buff, 0, count);<span style="display: none;">3GEYE5`X;C,@g?P6i	o</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; total += count;<span style="display: none;">3GEYEnM7S+Gp)}$L(JG-m</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<span style="display: none;">[]"|L%v8r$~3</span>我是采用了一个512字节的缓冲区去读取这些数据，经过测试发现Dell 1420机器上的花费是0毫秒。<span style="display: none;">3GEYEMG
U,s4| A$t</span><br />
快了非常多。<br />
<span style="display: none;">/P:B`OX*H�E3</span>不过脚本引擎除了读取源文件外，最重要的核心是解释引擎的速度。<span style="display: none;">3GEYE%\_`K4?#s;Zv</span><br />
<br />
<span style="display: none;">Ee[:?i$Rm3</span>有时间继续研究下。<span style="display: none;">3GEYEjY-`8MTs</span><br />
<br />
<br /><img src ="http://www.blogjava.net/gooogle/aggbug/188977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gooogle/" target="_blank">3G工作室</a> 2008-03-27 12:32 <a href="http://www.blogjava.net/gooogle/archive/2008/03/27/188977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>