今天李老师有事,让我临时给她代一下关于闪屏渐变的课,其中有这么一段代码:
/**
*渐变闪屏控制线程
*/
public void run() {
while (running) {
switch (index) {
case 0:
flashTime++;
if (flashTime == 30) {
index = 1;
}
break;
case 1:
/* 改变渐变图片每一个像素的透明度alpha值 */
for (int i = 0; i < shadowRgbImg2.length; i++) {
int alpha = (shadowRgbImg2[i] & 0xff000000) >>> 24; // 获取渐变图片的某一像素的alpha值
int oldAlpha = (srcRgbImg2[i] & 0xff000000) >>> 24; // 原始图片的对应像素的alpha值
if (alpha < oldAlpha) {
shadowRgbImg2[i] = ( (alpha + 1) << 24) |
(shadowRgbImg2[i] & 0x00ffffff); //增加alpha值
}
else {
running = false; //停止线程
}
}
break;
}
repaint(); //重绘
try {
Thread.sleep(50);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
程序中核心的代码,也是比较难理解的代码是:
int alpha = (shadowRgbImg2[i] & 0xff000000) >>> 24; // 获取渐变图片的某一像素的alpha值
int oldAlpha = (srcRgbImg2[i] & 0xff000000) >>> 24; // 原始图片的对应像素的alpha值
这代码>>>24说实话我还是第一次见到,我以为其实和>>24效果一样,是写错了呢,不过当我右移操作24位后,用>>就不发生透明度改变,用>>>就可以,不知道为什么。上网查也没查出这个相关解释。后来我输出了alpha和oldAlpha的值才发现问题,用>>>表示的时候,值是0和255,用>>表示的时候,值是0和-1,为什么0没有改变,而255变为-1了呢?很自然的想到,255和-1以及256的关系,立即,我就明白了,估计是和有符号和无符号有关!后来我实验了一下:
int a=0xacaabbcc;
int b = a>>24;
int c = a>>>24;
System.out.println(a); //很大的数
System.out.println("shi\n");
System.out.println(b); //0Xac 输出为-84
System.out.println("shi\n");
System.out.println(c); //0Xac 输出为172
结果可想而知,下面推证一下:
0xAC二进制码是 1010 1100
直接表达的无符号数是:128+32+8+4=172
若按有符号表示,第一位应该是符号位,1表示符号,后面是010 1100,取反后:1010011,再加1,所以得到:1010100,即64+16+4=84,加上符号,其代表的值就是-84,正好为我们的输出结果。
所以总结一下:在J2ME中>>>和>>都是移位操作,>>>表示的移位后按无符号表示数,>>是按照有符号数表示。当然,如果移位后首位为0,即为正数的话,两个操作的值是相等的。
同样,在C语言中,根据数据的类型不一样,其表示的结果也不一样的。哪怕是存储同样的东西,比如:
int a = 0x800000AC;//为了首地址为1,是负数且四个字节
int* p=&a;
unsigned int b = 0x800000AC;
unsigned int* pb=&b;
printf("%d, %u\n",a,b); // a = -2147483476, b = 2147483820
我们从MEMORY看到pa,pb里面存的内容都是:AC 00 00 80,低位在前高位在后,但是因为a,b的数据类型不一样,我们可以看到a,b的值也不一样,a = -2147483476, b = 2147483820
呵呵,总之,>>>和>>是不一样的,至少在J2ME中,另外一定要切记数据类型,同样的东西,数据类型不一样,表示的东西不一样的。