for (long l = 4946144450195624L; l > 0; l >>= 5)
System.out.print((char) (((l & 31 | 64) % 95) + 32));
这段代码有点诡异,输出的结果是
hello world。
4946144450195624是64位长整形,它的二进制表达方式为
10001100100100111110111111110111101100011000010101000 程序用每5个位为一组去解析字符,在for循环中使用
l >>5。
00100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000
d | l | r | o | w | | o | l | l | e | h
小写字母相关的二进制表示方法如下:
ascii | ascii | ascii | algorithm
character | decimal value | binary value | 5-bit codification
--------------------------------------------------------------
space | 32 | 0100000 | 11111
a | 97 | 1100001 | 00001
b | 98 | 1100010 | 00010
c | 99 | 1100011 | 00011
d | 100 | 1100100 | 00100
e | 101 | 1100101 | 00101
f | 102 | 1100110 | 00110
g | 103 | 1100111 | 00111
h | 104 | 1101000 | 01000
i | 105 | 1101001 | 01001
j | 106 | 1101010 | 01010
k | 107 | 1101011 | 01011
l | 108 | 1101100 | 01100
m | 109 | 1101101 | 01101
n | 110 | 1101110 | 01110
o | 111 | 1101111 | 01111
p | 112 | 1110000 | 10000
q | 113 | 1110001 | 10001
r | 114 | 1110010 | 10010
s | 115 | 1110011 | 10011
t | 116 | 1110100 | 10100
u | 117 | 1110101 | 10101
v | 118 | 1110110 | 10110
w | 119 | 1110111 | 10111
x | 120 | 1111000 | 11000
y | 121 | 1111001 | 11001
z | 122 | 1111010 | 11010
程序将5位值映射到7位ascii字符上去,l & 31 | 64) % 95) + 32
l & 31 用于截取二进制表达式中的最右边5位。
从上表中可以看出,小写字母ascii字符的二进制表达式,第7位和第6位都是1,表示方式为11xxxxx。而space字符只有第六位为1.
因为space字符的特殊性,我们不能简单地使用 (l &31 | 96(96二进制表达式为1100000)表达式获得ascii字符的二进制表示。
为了能够让space和其它小写字母同时处理,采用的方式是将第7位设置为1 - (
l &31 | 64) (64的二进制表达式为1000000)。至此,用于表示7位ascii字符的二进制表达式为10xxxxx. 其中Space为1011111,表示成十进制为95。对95求余,使得space归为0,(0000000),程序中的表现为
(l & 31 | 64) % 95
最后,我们只要将第6位设置成1,就能得到正确的7位ascii字符表示,程序中的体现为加上32 (二进制100000),
((l & 31 | 64) % 95) + 32
isolates 5 bits --+ +---- takes 'space' (and only 'space') back to 0
| |
v v
(l & 31 | 64) % 95) + 32
^ ^
turns the | |
7th bit on ------+ +--- turns the 6th bit on
下面再添加一个反向的方法,将由小写字符和空格组成的字符串,转换成64位的Long整形数值。
public static void main(String... args) {
String v = "hello world";
int len = 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);
}
转载请注明
http://www.wangmengjun.com/showThinkDetail.do?thinkId=1
更多其它信息请访问
http://www.wangmengjun.com
分享到:
相关推荐
这个"HelloWorld_"项目正是这样一个入门实例,用于在Visual Studio这个强大的集成开发环境中展示基本的代码编写和运行流程。 首先,让我们了解什么是Visual Studio。Visual Studio是由微软开发的一款全面的开发工具...
这个简单的程序通常只包含一行代码,用于在控制台上打印出 "Hello, World!" 这个字符串。在这个场景中,我们看到的"HelloWorld_helloworld_"可能是某种编程教程或示例项目的名称,它似乎旨在展示如何在不同情况下...
标签“hello world”进一步强化了这个主题,可能意味着我们将关注编程学习、代码编写和编程语言的基本概念。 考虑到压缩包子文件的文件名称为“BookShop”,我们可以推测这是一个与书店或图书管理相关的项目。这...
执行`./hello`命令,程序将在终端中打印出"Hello World"。 GCC提供了许多选项和参数,例如`-c`选项用于仅编译不链接,`-o`选项用于指定输出的可执行文件名。在实际开发中,这些选项可以帮助开发者实现更复杂的编译...
在不同的编程语言中,"hello world"程序的写法会有所不同,但其目的都是打印出"Hello, World!"这个简单的字符串。 在实际项目中,我们可能会遇到类似"Project開發信息・管理記録(2010年度)"这样的文档,这可能是...
这个简单的程序是许多编程语言教学的第一课,用于向初学者介绍如何在代码中打印出“Hello, World!”这个字符串,以此来验证编译环境的正确配置和基础语法的理解。 在IT领域,“Hello, World!”程序的重要性不言而喻...
此代码的作用是在标准输出设备(通常是控制台)上打印出"Hello, World!"字符串。 2. **输出结果图**:这可能是一个截图,展示了在CCS中运行程序后控制台的输出结果。当成功编译并运行上述代码时,用户将在终端看到...
至于“打印Hello World”,这是任何编程语言入门的第一步。在Microblaze环境下,我们需要编写一个简单的C程序,包含标准输入输出库,调用`printf`函数打印出"Hello World"字符串。这个程序将在Microblaze处理器上...
这会打印出“Hello World!”到控制台。 6. **编译与运行**:在命令行中,先使用`javac HelloWorld.java`编译源代码,生成`HelloWorld.class`字节码文件。然后,通过`java HelloWorld`运行程序,你会看到“Hello ...
这个简单的程序通常在控制台上打印出 "Hello, World!" 这个短语,以此来验证编译环境和基本语法的正确性。它的起源可以追溯到 Brian Kernighan 和 Dennis Ritchie 合著的《The C Programming Language》一书,书中...
这段代码会打印出"Hello, World!",这是编程领域的一个传统,用于验证一个新的编程环境是否已经正确设置,并且能够正常运行简单的程序。 总的来说,"helloworld.zip"包含的资源对于任何刚开始接触编程的人来说都是...
这一行代码定义了程序的名字为`HelloWorld`。在Delphi中,每个程序都需要有一个唯一的名称来标识它。 ##### 2. 指定应用程序类型 ```pascal {$APPTYPE CONSOLE} ``` 使用编译器指令`{$APPTYPE CONSOLE}`来指定当前...
标题中提到的“蛋疼的Hello World代码”暗示了这是一段非常规且复杂的实现方式,通常用于学习C语言中的指针、内存操作等高级概念。 #### 描述解析 描述部分展示了一段通过指针和内存操作来打印“Hello World”的...
这段代码在执行时会在控制台上打印出“Hello, World!”。在.NET Compact Framework中,`Console.WriteLine`方法用于向控制台输出一行文本,这里是我们的“Hello, World!”消息。 通过分析上述信息,我们可以了解到...
这段代码定义了一个公共类 "HelloWorld",其中包含一个主方法 "main",这是Java程序的入口点。`System.out.println` 语句用于在控制台打印 "Hello, World!"。 5. **运行程序**:在代码编辑器中,将光标放在 "main" ...
在`HelloWorld.asm`中,我们可能会看到类似以下的代码片段,用于打印"Hello, World!": ```assembly section .data hello db 'Hello, World!',0 section .text global _start _start: ; 设置段寄存器 mov ax,...
### 编写 Hello World Web 程序 #### 任务目标 本任务旨在通过一系列步骤指导初学者如何创建一个简单的 Node.js 程序,并在命令行中输出 "Hello World!" 文本。此过程不仅涉及基本的文件系统操作,还包括了 Node.js...
这个简单的程序在各种编程语言中的实现都大同小异,主要目的是为了让新手了解如何在计算机上打印出“Hello, World!”这句话,从而熟悉编程环境的基本操作。 在编程世界里,"Hello, World!"程序的编写标志着一个...
3. 在我们的"HelloWorld"示例中,`HelloWorld`类通过`SayHello`事件发布消息,而`Program`类订阅这个事件并提供响应方法。 学习并掌握委托和事件是理解C#面向对象编程和事件驱动编程的基础,这将有助于你构建更加...
【标题】"我的第一个JSP之helloworld"揭示了这个主题是关于初学者入门JSP(JavaServer Pages)编程,并通过一个经典的“Hello, World!”示例进行介绍。JSP是一种动态网页技术,允许开发者在HTML中嵌入Java代码,以...