这段代码是如何打印出 "hello world" 的?

22 浏览
0 Comments

这段代码是如何打印出 "hello world" 的?

我发现了这个奇特的现象:\n

for (long l = 4946144450195624l; l > 0; l >>= 5)
    System.out.print((char) (((l & 31 | 64) % 95) + 32));

\n输出结果:\n

hello world

\n这是如何工作的?

0
0 Comments

如何打印"hello world"?

在这个问题中,我们想要打印出"hello world"。在代码中,我们可以看到数字32和95被使用。实际上,这些数字代表可见的ASCII字符的范围,从32到127。每个字符在这里被映射为5位(你可以找到每个字符对应的5位组合),然后所有的位被连接在一起形成一个大数。正的long类型是63位数字,足够大来存储加密后的12个字符。所以它足够大来存储"hello world",但是对于更长的文本,你应该使用更大的数字,甚至使用BigInteger类型。

在一个应用程序中,我们想要通过短信传输可见的英文字符、波斯字符和符号。正如你所看到的,有32个波斯字符和95个英文字符和标准可见符号,总共有127个可能的值,可以用7位来表示。我们将每个UTF-8(16位)字符转换为7位,并获得超过56%的压缩比。因此,我们可以在相同数量的短信中发送长度两倍的文本。(在这里,似乎发生了类似的事情。)

在代码中,还有更多的事情发生。例如,代码中的"| 64"并没有被解释清楚其作用。实际上,95存在是因为你需要得到一个空格字符。

0
0 Comments

这段Groovy脚本打印了中间值,并输出了“hello world”。

问题的出现原因:

- 脚本中调用了一个名为`getBits`的方法,该方法将一个长整型数转换为二进制字符串。

- 循环中使用了位运算符`&`,`>>`和`|`来操作长整型数。

解决方法:

- 根据脚本中的代码逻辑,输出的结果是将长整型数转换为二进制字符串后的结果。

- 可以将脚本中的代码复制到Groovy的开发环境中运行,即可得到输出结果。

0
0 Comments

这段代码实现了将字符串"hello world"转换为64位长整型数的功能。下面是这个问题的出现原因和解决方法。

出现原因:

这个问题的出现是因为需要将字符串"hello world"转换为64位长整型数,但是这个过程并不是直接的转换,而是需要使用一种编码方案来进行转换。因此,需要找到一种合适的编码方案来实现这个功能。

解决方法:

解决方法是使用一个算法来将字符串转换为64位长整型数。具体步骤如下:

1. 将字符串中的每个字符转换为对应的5位二进制数。

2. 根据5位二进制数与ASCII编码表的对应关系,将每个5位二进制数转换为对应的7位ASCII字符。

3. 将每个7位ASCII字符转换为对应的10进制数。

4. 将每个10进制数按照从右到左的顺序进行位运算,将它们组合成一个64位长整型数。

这个问题的解决方法可以通过以下代码来实现:

public class D {
    public static void main(String... args) {
        String v = "hello world";
        int len = Math.min(12, v.length());
        long res = 0L;
        for (int i = 0; i < len; i++) {
            long c = (long) v.charAt(i) & 31;
            res |= ((((31 - c) / 31) * 31) | c) << 5 * i;
        }
        System.out.println(res);
    }
}

这段代码使用了一个循环来遍历字符串中的每个字符,然后根据字符的ASCII值进行位运算,将其转换为对应的5位二进制数。然后,根据5位二进制数与ASCII编码表的对应关系,将它们转换为对应的7位ASCII字符。最后,将每个7位ASCII字符转换为对应的10进制数,并按照从右到左的顺序进行位运算,将它们组合成一个64位长整型数。最终的结果将打印出来。

这个解决方法的优点是实现了将字符串转换为64位长整型数的功能,且代码逻辑清晰,易于理解。

0