詳解 & 0xff 的意義及作用


 

首先我們要都知道, &表示按位與,只有兩個位同時為1,才能得到1, 0x代表16進制數,0xff表示的數二進制1111 1111 占一個字節.和其進行&操作的數,最低8位,不會發生變化.

下面着重來說說&0xff都有哪些應用:

1. 只是為了取得低八位
通常配合移位操作符>>使用

例如:java socket通信中基於長度的成幀方法中,如果發送的信息長度小於65535字節,長度信息的字節

定義為兩個字節長度。這時候將兩個字節長的長度信息,以Big-Endian的方式寫到內存中

out.write((message.length>>8)&0xff);//取高八位寫入地址
out.write(message.length&0xff);//取低八位寫入高地址中
1
2
例如,有個數字 0x1234,如果只想將低8位寫入到內存中 0x1234&0xff
0x1234 表示為二進制 0001001000110100

0xff 表示為二進制 11111111

兩個數做與操作,顯然將0xff補充到16位,就是高位補0

此時0xff 為 0000000011111111

與操作 1&0 =0 1&1 =1 這樣 0x1234只能保留低八位的數 0000000000110100 也就是 0x34

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

public static void main(String[] args) {
byte b = -127;//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,

這樣能保證補碼的一致性,當然由於符號位發生變化,表示的十進制數就會變了

1111 1111 1111 1111 1111 1111 1000 0001

&

0000 0000 0000 0000 0000 0000 1111 1111

結果是

0000 0000 0000 0000 0000 0000 1000 0001
和原來的補碼 一致,但是顯然符號位變化了,表示的十進制數發生變化,變為129

結論:

java中基本類型從小擴展到大的數據類型時候,正數因為符號位是0,無論如何都是補零擴展,但是負數補零擴展和補符號位擴展完全不同,

負數補符號位擴展,保證十進制數不變

例如 byte>>>int -127自動按照補符號位擴展,在高24位補符號位1,表示的十進制數不變

補零擴展,保證補碼的一致性,但是表示的十進制發生變化

例如,本例中byte提升為int,&0xff的操作


免責聲明!

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



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