什么'<< '意思 ?这段代码意味着什么?

时间:2015-06-22 18:26:51

标签: java bit-manipulation bit-shift

我不明白这个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));
    }

我已经打印了值以了解结果是什么,但我仍然不知道这段代码的计算方法。循环内的条件不明确。

3 个答案:

答案 0 :(得分:11)

<<表示左shift operation,它将左侧操作数左移右侧操作数(See oracle docs)指定的位数。

假设您有一个十进制值5,其二进制表示为101

现在为简单起见,考虑一下,

byte a = (byte)0x05; 

因此,a的位表示将是

a = 00000101 // 1 byte is 8 bit

现在,如果您将a移至2,则a

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

所以,您现在可以理解,a左移3意味着

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 :(得分: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

答案 2 :(得分:1)

&LT;&LT;是Bitshift运算符。

基本上,每个数字都表示为一系列二进制数字(0和1),并且您将这些数字中的每一个移动到您指示的许多位置。因此,例如,15是00001111并且15 <&lt;&lt;&lt; 1是00011110(或30),而15 <&lt; 2是(00111100),即60。

当你到达符号位时会有一些特殊处理,但你应该明白这一点。