&是二進位制「與」運算,參加運算的兩個數的二進位制按位進行運算,運算的規律是:
0 & 0=0
0 & 1=0
1 & 0=0
1 & 1=1
對於參加運算的數要換算為二進位制進行運算,例如7 & 2的結果是2,過程如下:
7 & 2
=0111 & 0010
=0010
=2即 &:按位與運算,兩個當且僅當都為1的時候結果才為1,即1&1==1
,1&0==0&1==0&0==0
然後具體說一下在自己遇到時候的應用。在獲取檔案的md5值得時候,使用&位運算處理資料,由於使用biginteger獲取digest.update的byte的時候,出現首位為0的時候消去。
後通過轉化十六進製制之間的轉化之後,消除這個問題。中間遇到一段**使用 & 的**。
digest.update(buffer, 0, len); 方法
**片段
stringbuilder result = new stringbuilder();
byte b = digest.digest();
for (int i = 0; i < b.length; i++) {
return result.tostring();
integer.tostring((b[i] & 0xff)+0x100,16).substring(1);
解釋:b[i]是乙個byte,0x表示為十六進製制,
0xff的十進位制為15*16+15=255,0x100的十進位制為1*16*16=256
integer.tostring(num,16);轉成16進製制,substring(1),起始位1, 結束為最後,來擷取字串。
即 轉成二進位制計算之後,又轉成16進製制,然後進行擷取。
byte[i] & 0xff 的「與」運算,即與十六進製制計算
&0xff目的應該是為了讓原來的負數變成正數
byte[i] & 0xff與運算,如果與十六進製制計算得到的byte[i]為負數,
計算機儲存資料機制:正數儲存的二進位制原碼,負數儲存的是二進位制的補碼。
其中 補碼是負數的絕對值反碼加1。絕對值,取反,加1。
當 byte --> int ,byte乙個位元組即八位二進位制,int4個位元組即32位二進位制, byte --> int 就是由8位變 32 位 高24位全部補1
這樣前24位都是1。1111 1111 1111 1111 1111 1111 **** ****
而 0xff的二進位制表示就是:1111 1111。 轉成int計算的時候 高24位補0:0000 0000 0000 0000 0000 0000 1111 1111
由& 的運算規則,只有1&1=1,那麼
1111 1111 1111 11111111 1111 **** ****
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 0000 0000 #### ####
這樣 byte[i] & 0xff之後,可以使得前24位變0,稱為正數。
所以需要& 0xff 使得byte原來的負值變成正的
位與 按位或 按位異或 運算
1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 00000001 1的二進位制補碼...
位運算( 按位與 按位或 異或)
參加運算的兩個數,按二進位制位進行 運算。運算規則 只有兩個數的二進位制同時為1,結果才為1,否則為0。負數按補碼形式參加按位與運算 即 0 0 0 0 1 0,1 0 0,1 1 1。比如10 11 即 0000 1010 0000 1011 0000 1010 所以 10 11 等於10 參加運...
位運算(按位與 按位或 異或)
按位與運算子 參加運算的兩個數,按二進位制位進行 與 運算。運算規則 只有兩個數的二進位制同時為1,結果才為1,否則為0。負數按補碼形式參加按位與運算 即 0 0 0 0 1 0,1 0 0,1 1 1。例 3 5 即 00000011 00000101 00000001 所以 3 5的值為1。按位...