'<<' 是什么意思?这段代码是什么意思?
What does '<< ' mean ? And what this code mean?
我不明白这个 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));
}
我已经打印了值以了解结果是什么,但我仍然不知道这段代码计算的是什么。循环内的条件不清楚。
<<
表示左shift operation, which shifts the left-hand operand left by the number of bits specified by the right-hand operand (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
我的猜测是它近似圆周率
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
<< 是 Bitshift 运算符。
基本上,每个数字都表示为一系列二进制数字(0 和 1),并且您要将这些数字中的每一个向左移动您指定的任意位置。因此,例如,15 是 00001111,15 << 1 是 00011110(或 30),而 15 << 2 是 (00111100),即 60。
到达符号位时会进行一些特殊处理,但您应该明白这一点。
我不明白这个 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));
}
我已经打印了值以了解结果是什么,但我仍然不知道这段代码计算的是什么。循环内的条件不清楚。
<<
表示左shift operation, which shifts the left-hand operand left by the number of bits specified by the right-hand operand (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
我的猜测是它近似圆周率
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
<< 是 Bitshift 运算符。
基本上,每个数字都表示为一系列二进制数字(0 和 1),并且您要将这些数字中的每一个向左移动您指定的任意位置。因此,例如,15 是 00001111,15 << 1 是 00011110(或 30),而 15 << 2 是 (00111100),即 60。
到达符号位时会进行一些特殊处理,但您应该明白这一点。