今天***有事,讓我臨時給她代一下關於閃屏漸變的課,其中有這麼一段**:
/**
*漸變閃屏控制線程
*/public void run()
break;
case 1:
/* 改變漸變每乙個畫素的透明度alpha值 */
for (int i = 0; i < shadowrgbimg2.length; i++)
else
}break;
}repaint(); //重繪
try
catch (interruptedexception e)
}}
程式中核心的**,也是比較難理解的**是:
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中,另外一定要切記資料型別,同樣的東西,資料型別不一樣,表示的東西不一樣的。
J2ME中的分而治之
這兩天在研究j2me中setclip的用法.兩張切換時,如果是新的從內向外以矩形顯示,可以使用一次setclip設定繪製的矩形區域.但是,現在反回來,從外向內,以矩形框顯示,但是j2me裡面沒有這樣的方法,怎麼辦?有了,咱們給他來個分而治之,一次setclip不行,咱們可以分多次嘛.就現在的情況,可...
j2me中的畫素渲染
以前看到過別人寫的一些關於在 j2me 中使用畫素渲染的方法,不過都是理論論述,而且很多人都質疑 2.0中的 drawrgb 的效率,自己也有相同的想法,但是畫素渲染所帶來的巨大好處還是讓人動心的。所以這次下了決心,專門抽了時間來實現了一下,就是你在下面所看到的一些資料。機型占用記憶體 1 臨界渲染...
j2me中的Display介紹
好好看一下j2me 的api,其中裡面乙個很簡單的列子就是display類,常用的只有display.getdisplay midlet 和setcurrent 不過display的功能是十分的強大。display總結起來有兩個作用 1,獲取螢幕的屬性。色彩,支援的顏色數量資訊。iscolor 判斷...