日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]java中byte转换int时为何与0xff进行与运算

發布時間:2025/3/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]java中byte转换int时为何与0xff进行与运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在剖析該問題前請看如下代碼
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[ i ] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
上面是將byte[]轉化十六進制的字符串,注意這里b[ i ] & 0xFF將一個byte和 0xFF進行了與運算,然后使用Integer.toHexString取得了十六進制字符串,可以看出
b[ i ] & 0xFF運算后得出的仍然是個int,那么為何要和 0xFF進行與運算呢?直接 Integer.toHexString(b[ i ]);,將byte強轉為int不行嗎?答案是不行的.

其原因在于:
1.byte的大小為8bits而int的大小為32bits
2.java的二進制采用的是補碼形式

在這里先溫習下計算機基礎理論

byte是一個字節保存的,有8個位,即8個0、1。
8位的第一個位是符號位,
也就是說0000 0001代表的是數字1
1000 0000代表的就是-1
所以正數最大位0111 1111,也就是數字127
負數最大為1111 1111,也就是數字-128

上面說的是二進制原碼,但是在java中采用的是補碼的形式,下面介紹下什么是補碼

1、反碼:
一個數如果是正,則它的反碼與原碼相同;
一個數如果是負,則符號位為1,其余各位是對原碼取反;

2、補碼:利用溢出,我們可以將減法變成加法
對于十進制數,從9得到5可用減法:
9-4=5 因為4+6=10,我們可以將6作為4的補數
改寫為加法:
9+6=15(去掉高位1,也就是減10)得到5.

對于十六進制數,從c到5可用減法:
c-7=5 因為7+9=16 將9作為7的補數
改寫為加法:
c+9=15(去掉高位1,也就是減16)得到5.

在計算機中,如果我們用1個字節表示一個數,一個字節有8位,超過8位就進1,在內存中情況為(100000000),進位1被丟棄。

⑴一個數為正,則它的原碼、反碼、補碼相同
⑵一個數為負,剛符號位為1,其余各位是對原碼取反,然后整個數加1

- 1的原碼為 10000001
- 1的反碼為 11111110
+ 1
- 1的補碼為 11111111

0的原碼為 00000000
0的反碼為 11111111(正零和負零的反碼相同)
+1
0的補碼為 100000000(舍掉打頭的1,正零和負零的補碼相同)

Integer.toHexString的參數是int,如果不進行&0xff,那么當一個byte會轉換成int時,由于int是32位,而byte只有8位這時會進行補位,
例如補碼11111111的十進制數為-1轉換為int時變為11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是這個數是不對的,這種補位就會造成誤差。
和0xff相與后,高24比特就會被清0了,結果就對了。

----
Java中的一個byte,其范圍是-128~127的,而Integer.toHexString的參數本來是int,如果不進行&0xff,那么當一個byte會轉換成int時,對于負數,會做位擴展,舉例來說,一個byte的-1(即0xff),會被轉換成int的-1(即0xffffffff),那么轉化出的結果就不是我們想要的了。

而0xff默認是×××,所以,一個byte跟0xff相與會先將那個byte轉化成×××運算,這樣,結果中的高的24個比特就總會被清0,于是結果總是我們想要的。

?

轉載于:https://blog.51cto.com/mcmoo/660830

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的[转]java中byte转换int时为何与0xff进行与运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。