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

当你的星座有这么进场一些特殊的处理位,但你应该明白这一点。