为什么这显然 "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.