2015-06-22 271 views
1

我不明白這是什麼意思doCalculatePi或者呢,下面的例子:'<<'是什麼意思?而這個代碼是什麼意思?

public static double doCalculatePi(final int sliceNr) { 
    final int from = sliceNr * 10; 
    final int to = from + 10; 
    final int c = (to << 1) + 1; 
    double acc = 0; 
    for (int a = 4 - ((from & 1) << 3), b = (from << 1) + 1; b < c; a = -a, b += 2) { 
     acc += ((double) a)/b; 
    } 
    return acc; 
} 

public static void main(String args[]){ 
    System.out.println(doCalculatePi(1)); 
    System.out.println(doCalculatePi(2)); 
    System.out.println(doCalculatePi(3)); 
    System.out.println(doCalculatePi(4)); 
    System.out.println(doCalculatePi(10)); 
    System.out.println(doCalculatePi(100)); 
    } 

我已打印的值,以瞭解什麼結果,但我仍然不知道這是什麼代碼計算。循環內的條件不清楚。

+7

您可能想看看java Tutorials的[Operators](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)頁面。 – azurefrog

+1

「我仍然不知道這段代碼計算的是什麼。」好的,然後運行它並查看它的計算結果。 – hexafraction

+0

我做了,但輸出不明顯 – Bionix1441

回答

4

我的猜測是,它接近PI與

PI = doCalculatePi(0)+doCalculatePi(1)+doCalculatePi(2)+... 

只是一個猜測。

嘗試這個

double d = 0; 
for(int k = 0; k<1000; k++) { 
    System.out.println(d += doCalculatePi(k)); 
} 

給我

3.0418396189294032 
3.09162380666784 
3.1082685666989476 
[...] 
3.1414924531892394 
3.14149255348994 
3.1414926535900394 
+0

我同意這個答案...不知道爲什麼這麼多downvotes ...(哦,看,維護。) – River

+1

我沒有downvote,但一答案的缺點是它沒有解決OP的主要問題:不知道'<<'操作符的作用。也沒有解釋_why_代碼應該生成pi的值。此外,OP的代碼不會將調用的返回值與具有不同參數的'doCalculatePi()'相加;它只是打印這些值,所以很難理解這個答案和OP的問題之間的關係。 –

+1

我的意思是說,他可以在Java運營商頁面中添加一個鏈接,但'<<'問題非常基本,可以在Google上查詢。這回答了問題的一部分,這就是它在SO上被問到的原因。 (雖然我認爲比「收斂PI」更準確的答案是「計算PI的第10個數字」)。 – River

11

<<表示左側shift operation,左側操作數左移了右側操作數(See oracle docs)指定的位數。

說,你有一個十進制值,5其二進制表示爲101

現在爲簡單起見,考慮

byte a = (byte)0x05; 

因此,中a位表示會,

a = 00000101 // 1 byte is 8 bit 

現在,如果您通過2左移a,那麼a

a << 2 
a = 00010100 //shifted place filled with zero/s 

所以,你現在可以理解,通過3左移a意味着

a << 3 
a = 00101000 

爲了更好地理解,你需要學習Bitwise operation

注意,您在二進制

使用 int,而不是 byte,默認情況下,int數據類型是一個32位有符號整數(參考 here),所以你必須要考慮,

int a = 5; 

a << 3 
a = 00000000 00000000 00000000 00101000 // total 32 bit 
1

< <是Bitshift操作。

基本上,每個數字都表示爲一系列的二進制數字(0和1),並且您將這些數字中的每一位都移到左側,但無論您指出多少位置。因此,例如,15是00001111和15 < < 1 00011110(或30),而15 < < 2(00111100),這是60

當你的星座有這麼進場一些特殊的處理位,但你應該明白這一點。