今天李老师有事,让我临时给她代一下关于闪屏渐变的课,其中有这么一段代码:
/** *渐变闪屏控制线程 */ 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中,另外一定要切记数据类型,同样的东西,数据类型不一样,表示的东西不一样的。