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

Bio*_*441 1 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));
    }
Run Code Online (Sandbox Code Playgroud)

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

rak*_*rul 11

<<表示左移操作,它将左侧操作数左移右侧操作数指定的位数(参见oracle docs).

比如,你有一个十进制值,5二进制表示101

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

byte a = (byte)0x05; 
Run Code Online (Sandbox Code Playgroud)

因此,比特表示a将是,

a = 00000101 // 1 byte is 8 bit
Run Code Online (Sandbox Code Playgroud)

现在,如果你左移a通过2,那么a将是

a << 2
a = 00010100 //shifted place filled with zero/s
Run Code Online (Sandbox Code Playgroud)

所以,你现在可以理解,a通过3手段左移

a << 3
a = 00101000
Run Code Online (Sandbox Code Playgroud)

为了更好地理解,您需要研究按位运算.

注意,你使用的intbyte,而且默认情况下,int数据类型是一个32位有符号整数(这里引用),所以你必须考虑,

int a = 5;
Run Code Online (Sandbox Code Playgroud)

在二进制

a << 3
a = 00000000 00000000 00000000 00101000 // total 32 bit
Run Code Online (Sandbox Code Playgroud)