2011-01-12 139 views
65

我試圖在Java字節變量中設置位。它確實提供了像.setBit(i)這樣的propper方法。有人知道我怎麼能意識到這一點?在字節中設置特定位

我可以通過一個給定的字節迭代逐位:

if((my_byte & (1 << i)) == 0){ 

} 

但是我不能設置該位置爲1或0,可以嗎?

回答

109

使用按位orand運營商。要設置位:

my_byte = my_byte | (1 << pos); 

要取消設置位:

my_byte = my_byte & ~(1 << pos); 
+3

另請參見異或運算符 - 它是該武器庫中的第三個強大工具(請參閱維基百科關於掩蔽的文章)。 – Hardryv 2012-03-29 17:35:58

59

要設置位:

myByte |= 1 << bit; 

要清除它:

myByte &= ~(1 << bit); 
+0

你是什麼意思,這將「設置」有點?假設你試圖訪問第0位,myByte包含11101101.這是什麼意思?我如何控制設定的價值? – Michael 2016-03-06 05:08:40

+3

@邁克爾:設置一點意味着使它1.清除一點意味着使它爲0. – 2016-03-06 08:50:00

10

你需要的技術是隔離的選擇位和設置或清除。你已經有了表達式來隔離這個位,因爲你正在使用它來測試它。您可以通過對該位進行或運算來設置該位,也可以通過位的1的補碼將該位與位進行清零。

boolean setBit; 
my_byte = setBit 
      ? myByte | (1 << i) 
      : myByte & ~(1 << i); 
6

請參閱爲您完成工作的類java.util.BitSet。

設置:myByte.set(bit); 要重置:myByte.clear(bit); 要與布爾填寫:myByte.set(bit, b); 要得到布爾:b = myByte.get(bit); 獲取位圖:byte bitMap = myByte.toByteArray()[0];