2012-03-10 284 views
2

我有一個字節數組,例如從字節[0]到字節[2]的。我想先將字節[0]分成8位。然後是字節[1],最後是字節[2]。通過分裂我的意思是,如果字節[0] = 12345678那麼我想分裂爲變量A = 8,變量B = 7,變量C = 6,變量D = 5,........變量H = 0 。如何分割字節並將這些位存儲到變量中?我想在JAVA中執行此操作。將一個字節拆分爲位

+1

@Samir:謝謝,薩米爾不是編輯的如果你有回答我的問題,我會更加高興 – suraj 2012-03-10 12:03:41

+0

你嘗試'Integer.toBinaryString(your_byte_value)'? – waqaslam 2012-03-10 12:20:08

+0

你說:「我的意思是,如果字節[ 0] = 12345678「,一個字節變量具有'12345678'的值,sun規定一個字節是'-128'到'127'。 – MJM 2012-03-10 13:18:55

回答

5

好吧,按位操作似乎幾乎就是你所說的。 一個字節由8個比特,所以它會在0憤怒到255 寫成二進制這是00000000〜11111111

位運算是那些主要使用口罩,以獲取儘可能多的信息儘可能超出一個字節。

說例如你有你的1101 0011字節(僅用於可見性的空間)= 211(十進制)。你可以把它分成2個「變量」b1和b2,每個半字節。因此它們將覆蓋0到15的範圍。

您如何做到這一點是通過定義一些掩碼。要獲得第一個半個字節值的掩碼將爲0000 1111. 您將值11010011應用於位運算符和(&)運算符。 所以說字節b = 211;字節掩碼1 = 15; OR字節b = 0x11010011;字節掩碼1 = 0x00001111; 然後你有你的可變字節b1 = b & mask1;

因此,應用該操作會導致b1 = 00000011 = 3; 使用掩碼字節mask2 = 0x11110000;在b上應用相同的操作,你會得到字節b2 = mask2 & b = 0x11010000;

現在當然會讓數字b2對您來說可能太大了。所有你需要做的,如果你想獲得值0x1101是右移它。因此b2 >> = 4;

你可以讓你的口罩以任何形式出現,但通常以十進制表示它們的權力(這樣你就可以從字節中取出任何一點)或者決定你想要的變量的範圍並使掩碼「較大」如0x00000011或ox00001100。這兩個掩碼將分別從一個字節中獲取2個值,每個值的範圍從0到3,您可以在一個字節內容納4個值。

欲瞭解更多信息,請致電relevant wiki

對不起,該值是有點過(因爲字節似乎從-128到到127,但這個想法是一樣的。

二編輯(沒用過位運算自己笑)......的「 0X」符號是十六進制所以你實際上要計算自己是什麼01001111實際上意味着...相當蘇茨基:|。但它會做的伎倆

0
boolean a = (theByte & 0x1) != 0; 
boolean b = (theByte & 0x2) != 0; 
boolean c = (theByte & 0x4) != 0; 
boolean d = (theByte & 0x8) != 0; 
boolean e = (theByte & 0x10) != 0; 
boolean f = (theByte & 0x20) != 0; 
boolean g = (theByte & 0x40) != 0; 
boolean h = (theByte & 0x80) != 0; 
+0

只是一個小小的評論:你確定你應該檢查0不是1? – 2012-03-10 13:04:47

+0

@BorisStrandjev他應該檢查大於0.因爲0x80&0x80仍然是0x80。 – AlanFoster 2012-03-10 13:06:09

+0

或!= 0實際上。我不確定哪兩個會更快...... – 2012-03-10 13:09:06