为什么这显然 "random" 数字打印 "Java is Awesome"
Why this apparently "random" numbers print "Java is Awesome"
这个程序如何打印“Java is Awesome”?
String s = IntStream.of(1635148106, 544434464, 1936029505, 6647151)
.flatMap(e -> IntStream.range(0, 4).map(i -> e >> i * 8))
.mapToObj(i -> Character.toString((byte) i))
.collect(Collectors.joining());
System.out.println(s);
对你的一点帮助:
01001010 01100001 01110110 01100001 (avaJ)
00100000 01101001 01110011 00100000 ( si )
01000001 01110111 01100101 01110011 (sewA)
01101111 01101101 01100101 (emo)
现在倒着读:
01100001 01110110 01100001 01001010
00100000 01110011 01101001 00100000
01110011 01100101 01110111 01000001
00000000 01100101 01101101 01101111
这不过是:
1247901281
543781664
1098343795
1869440256
IntStream.of(1635148106, 544434464, 1936029505, 6647151)
创建一个包含 4 个元素的流。然后,对于这些元素中的每一个,我们将做
e -> IntStream.range(0, 4).map(i -> e >> i * 8)
这基本上创建了 4 个由操作产生的元素
e >> 0
e >> 8
e >> 16
e >> 24
因此,对元素 IntStream.of(1635148106, 544434464, 1936029505, 6647151)
的整个操作 e -> IntStream.range(0, 4).map(i -> e >> i * 8)
结果为:
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
flatMap(...)
部分将之前的操作转换为IntStream
.
那么在接下来的操作中:
mapToObj(i -> Character.toString((byte) i))
首先应用 (byte) i
因此:
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
变为:
74 97 118 97
32 105 115 32
65 119 101 115
111 109 101 0
如果你看一下 ASCII table:
对应于:
JAVA
<space>is<space>
Awes
ome<null>
剩余操作:
.mapToObj(i -> Character.toString((byte) i))
.collect(Collectors.joining());
只需将其转换为 String
表示即可。
对于那些想知道如何从
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
你得到:
74 97 118 97
32 105 115 32
65 119 101 115
111 109 101 0
首先,将第一个元素转换为二进制,并且由于一个字节是8位,因此提取该二进制的最后8位,并将其转换回十进制。例如:
1635148106
二进制是
1100001011101100110000101001010
后8位:
01001010
十进制为74
.
或者转换成十六进制1635148106
-> 6176614A
确切相关部分(字节) -> 4A
直接看ASCII table -> J
.
这个程序如何打印“Java is Awesome”?
String s = IntStream.of(1635148106, 544434464, 1936029505, 6647151)
.flatMap(e -> IntStream.range(0, 4).map(i -> e >> i * 8))
.mapToObj(i -> Character.toString((byte) i))
.collect(Collectors.joining());
System.out.println(s);
对你的一点帮助:
01001010 01100001 01110110 01100001 (avaJ)
00100000 01101001 01110011 00100000 ( si )
01000001 01110111 01100101 01110011 (sewA)
01101111 01101101 01100101 (emo)
现在倒着读:
01100001 01110110 01100001 01001010
00100000 01110011 01101001 00100000
01110011 01100101 01110111 01000001
00000000 01100101 01101101 01101111
这不过是:
1247901281
543781664
1098343795
1869440256
IntStream.of(1635148106, 544434464, 1936029505, 6647151)
创建一个包含 4 个元素的流。然后,对于这些元素中的每一个,我们将做
e -> IntStream.range(0, 4).map(i -> e >> i * 8)
这基本上创建了 4 个由操作产生的元素
e >> 0
e >> 8
e >> 16
e >> 24
因此,对元素 IntStream.of(1635148106, 544434464, 1936029505, 6647151)
的整个操作 e -> IntStream.range(0, 4).map(i -> e >> i * 8)
结果为:
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
flatMap(...)
部分将之前的操作转换为IntStream
.
那么在接下来的操作中:
mapToObj(i -> Character.toString((byte) i))
首先应用 (byte) i
因此:
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
变为:
74 97 118 97
32 105 115 32
65 119 101 115
111 109 101 0
如果你看一下 ASCII table:
对应于:
JAVA
<space>is<space>
Awes
ome<null>
剩余操作:
.mapToObj(i -> Character.toString((byte) i))
.collect(Collectors.joining());
只需将其转换为 String
表示即可。
对于那些想知道如何从
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
你得到:
74 97 118 97
32 105 115 32
65 119 101 115
111 109 101 0
首先,将第一个元素转换为二进制,并且由于一个字节是8位,因此提取该二进制的最后8位,并将其转换回十进制。例如:
1635148106
二进制是
1100001011101100110000101001010
后8位:
01001010
十进制为74
.
或者转换成十六进制1635148106
-> 6176614A
确切相关部分(字节) -> 4A
直接看ASCII table -> J
.