通常配合移位操作符》使用
例如,有個數字 0x1234,如果只想將低8位寫入到記憶體中
將 0x1234 & 0xff
0x1234 表示為二進位制 00010010 00110100
0xff 表示為二進位制 11111111
兩個數做與操作,顯然將0xff補充到16位,就是高位補0
此時0xff 為 0000000011111111
與操作 1&0 =0 1&1 =1 這樣 0x1234只能保留低八位的數 0000000000110100 也就是 0x34
什麼是低八位什麼是高八位
1. 彙編中,為了表示乙個整數型別,用兩個位元組來表示,即總共16位。高低8位是指16位的儲存單元;
2. 彙編可以直接呼叫暫存器,比記憶體快,0~~7位為低八位,8~15位高八位,所以暫存器使用比較方便;
比如00000000 00000000,前八個0的順序是第15位到第8位,就是高八位後面的8個0就是低8位。
乙個位元組是8位,彙編中,為了表示乙個整數型別,用兩個位元組來表示,即總共16位。同時在彙編中,乙個整型是用二進位制來表示的。例如 2 的二進位制為10,4為100,3是11。但是用兩個位元組表示3為0000 0000 0000 0011,共16為,20是0000 0000 0001 0100.其中前0000 0000為高8位,後邊0001 0100為低8位。兩個位元組的資料能表示正65535 - 負655
高低8位是指16位的儲存單元,比如00000000 00000000
前八個0的順序是第15位到第8位,就是高八位後面的8個0就是低8位
舉個例子:1111000010101010,那麼前面的11110000就是高八位,後面的10101010就是低八位。
我們只關心二進位制的機器數而不關注十進位制的值,那麼byte &0xff只是對其最低8位的複製,通常配合邏輯或 『』|』'使用,達到位元組的拼接,但不保證其十進位制真值不變。
public static void main(string args) //輸出結果-127,129
b是8位的二進位制數,在與上0xff(也就是 11111111),不就是其本身嗎,輸出在控制台結果為什麼是129呢?
首先計算機內的儲存都是按照補碼儲存的,-127補碼表示為 1000 0001,int a = b;將byte 型別提公升為int時候,b的補碼提公升為 32位,補碼的高位補1,也就是1111 1111 1111 1111 1111 1111 1000 0001。
負數的補碼轉為原碼,符號位不變,其他位取反,在加1,正數的補碼,反碼都是本身
結果是 1000 0000 0000 0000 0000 0000 0111 1111表示為十進位制 也是 -127,也就是 當 byte -> int 能保證十進位制數不變,但是有些時候比如檔案流轉為byte陣列時候,我們不是關心的是十進位制數有沒有變,而是補碼有沒有變,這時候需要&上0xff。
本例子中,將byte轉為int 高24位必將補1,此時補碼顯然發生變化,在與上0xff,將高24重新置0,
這樣能保證補碼的一致性,當然由於符號位發生變化,表示的十進位制數就會變了
byte為什麼要與上0xff?
無意間翻看之間的 發現了一段難以理解的 byte bs digest.digest origin.getbytes charset.forname charsetname for int i 0 i bs.length i return sb.tostring bs是由一段字串經過md5加密後,輸出...
java中byte轉int需要 0xff
工作的時候遇到了byte和int互轉的情況,發現都會 0xff,查閱了一些資料,總結記錄一下 1.byte轉int 8位byte擴充套件到32位int會在高位的24位按符號位擴充套件,而加了 0xff 1111 1111 就是把高位的24位變成0來確保是按補零擴充套件。如果是正數按符號位擴充套件和補...
位運算子 0xFF的運算與講解
區分 丨,的運算規則 按位與運算子 表示 兩個運算元中位都為1,結果為1 如果兩個操作中位乙個1另乙個0 結果為0 即運算規則 0 0 0 0 1 0 1 0 0 1 1 1 例如 1010 1110 1010 按位或運算子 表示 兩個操作中位只有乙個為1,結果就等與1 即運算規則 0 0 0 0 ...