詳解 & 0xff 的作用


原文鏈接:https://blog.csdn.net/i6223671/article/details/88924481

1.只是為了取得低八位

通常配合移位操作符>>使用

例如,有個數字 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就是低八位。

2. 保證補碼的一致性

    我們只關心二進制的機器數而不關注十進制的值,那么byte &0xff只是對其最低8位的復制,通常配合邏輯或 ‘’|’'使用,達到字節的拼接,但不保證其十進制真值不變。

public static void main(String[] args) {
		byte b = -127;//10000001   127二進制:01111111,-127:127取反加1,10000001 
		int a =  b;
		System.out.println(a);
		a =  b&0xff;
		System.out.println(a);
	}//輸出結果-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,
這樣能保證補碼的一致性,當然由於符號位發生變化,表示的十進制數就會變了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM