2010-11-11 67 views
2

這應該很簡單,但我無法更改某些使用按位運算符並轉換爲Java的C代碼。Java中按位運算符作用於兩個字節

在C我有:

unsigned short Color(byte r, byte g, byte b) 
{ 
    return(((unsigned short)g & 0x1F)<<10 | ((unsigned short)b & 0x1F)<<5 | (unsigned short)r & 0x1F); 
} 

此功能,色彩,16位返回他們在那裏的15代表紅色,綠色和藍色通道3個5位值。我試圖在Java中做類似的事情,除了我遇到數據類型的問題。

在java中我有:

int r=someval, g=anotherval, b=yetanotherval; 

而且我想這些整數轉換爲2字節的數據類型,並使用相同的按位/移位操作同上。

解決此問題的最佳方法是什麼?我正在考慮一個2字節的數組,但似乎沒有必要。

編輯

所以我給它一個嘗試在Java中與短褲,但似乎仍然是一個問題。我開始簡單的搭配:

short r=someval, g=anotherval, b=yetanotherval; 
short colorData = g & 0x001F; 

但是編譯器會抱怨:「不能轉換從int到short」

+0

請注意,C中的(無符號短符號)投射根本沒有意義,因爲算術/位運算自變量會自動提升爲[unsigned] int,而「&」的結果也將爲int。 – Vovanium 2010-11-11 14:55:44

回答

2

你必須在Java中short型爲好,但它總是簽署,有在Java中沒有無符號。

因此,使用int可能會更好,因此您不需要使用符號位來保存實際顏色數據,這可能會有點混亂。

這應該工作爲出發點,至少:

int Color(int r, int g, int b) 
{ 
    return ((g & 0x1F) << 10) | ((b & 0x1F) << 5) | (r & 0x1F); 
} 

我所提出的論點int爲好,爲了簡​​單起見。

更新:聽起來(似乎),因爲如果你實際上可以使用short,因爲你只需要15位的顏色格式。然後讓我們做的是:

short Color(short r, short g, short b) 
{ 
    return ((g & 0x1F) << 10) | ((b & 0x1F) << 5) | (r & 0x1F); 
} 

我沒試過編譯上述,但很可能你會得到轉換錯誤,會需要增加明確short蒙上整個讓它編譯。

+0

謝謝,我實際上不使用最左邊的位,因爲我只需要16位中的15位。那麼短褲會爲我工作嗎? – Anon 2010-11-11 14:46:51

1

char:char數據類型是一個單一的16位Unicode字符。它的最小值爲'\ u0000'(或0),最大值爲'\ uffff'(或65,535)。

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Java的char數據類型是2個字節默認。

+0

我給了char一個更早的嘗試,但編譯器抱怨「無法轉換從char到int」每當我嘗試做一個按位'和'與0x001F。 – Anon 2010-11-11 14:47:58

+0

現在變得有些髒了,但是你可以嘗試指定你的十六進制,就像這個「'\ u001F'」。這是字符值的字面值。但是看看你的其他評論,如果你只需要15位就可以使用簡寫。 – Jules 2010-11-11 14:52:10

1

由於您僅使用15位,因此short數據類型上的符號位將不成問題。

2

在java中,所有的計算操作,即使只有類型比INT小,總是導致爲int,所以你必須明確地將它轉換回短:

short colorData = (short)(g & 0x001F); 
2

在您的例子

short r=someval, g=anotherval, b=yetanotherval; 
short colorData = g & 0x001F; 

g和十六進制文字都會自動提升爲int,因爲邏輯和運算符總是工作並返回整數。您當然可以將結果投回到short

short colorData = (short)(g & 0x001F); 

同樣應該爲char數據類型,這實際上是在JVM上唯一的無符號整數類型的工作。我建議不要以這種方式使用char類型,除非這是你的程序的一個獨立的性能/內存敏感部分,因爲使用char進行算術對於源代碼的其他維護者可能看起來很奇怪並且違反直覺。