按位與 的運算

2021-08-09 11:55:51 字數 1565 閱讀 4388

&是二進位制「與」運算,參加運算的兩個數的二進位制按位進行運算,運算的規律是:

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。按位...