2017-06-10 118 views
1

最近我一直在學習位運算符和沿途有這樣的代碼,發現使用AND(&)位運算符的十進制數的二進制數字,代碼如下:java的瞭解位操作

byte b = -34; 

for(int t = 128;t > 0; t = t/2) 
{ 
if((b & t) != 0)System.out.println("1 "); 
else System.out.println("0 "); 
System.out.println("b & t yields: " + (b & t)); 
    } 

我修改了代碼以顯示在每次迭代過程中由b & t計算的值。我想了解這個代碼背後的確切機制,爲什麼它可以找到二進制數字,請解釋​​爲什麼每次迭代都要比較b,爲什麼每次迭代都除以2?另外,我想知道如何(b & t)通過列出二進制數字來手動計算。我的確瞭解&的工作方式,但是當我列出了34和128的二進制數字並將它們進行比較時:

1 0 0 0 0 0 0 0(128) 
0 0 1 0 0 0 1 0(34) //I am unsure if the negative sign should be included 
--------------- 
0 0 0 0 0 0 0 0 

我得到的結果是0,但程序返回128這是令人困惑。

下面我還將包括程序的執行結果:

1 
b & t yields: 128 
1 
b & t yields: 64 
0 
b & t yields: 0 
1 
b & t yields: 16 
1 
b & t yields: 8 
1 
b & t yields: 4 
1 
b & t yields: 2 
0 
b & t yields: 0 

非常感激您的幫助:)

+1

當今計算機使用二進制補碼,所以'-34'由'256-34'表示爲無符號字節。 – user202729

+0

非常感謝,它是有道理的,現在-34和128返回128 :) – TheRelativisticPhiloSheep

回答

0

通過2分割t是位右移:

1 0 0 0 0 0 0 0 128 = t 
0 1 0 0 0 0 0 0 64 = t/2 
0 0 1 0 0 0 0 0 32 = t/2/2 
... 

t總是有一個位設置爲1,其他均爲0

然後你用&與b比較。當且僅當兩個輸入中的相應位都是1時,每個結果位都是1。 這意味着我們基本檢查b中的位是否爲1位於t位爲1的位置。這是爲從左到右的所有位進行的。

+0

這是我需要感謝! – TheRelativisticPhiloSheep