`
MouseLearnJava
  • 浏览: 465928 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

这代码怎么就打印出"hello world"了呢?

    博客分类:
  • Java
阅读更多
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
0
0
分享到:
评论

相关推荐

    HelloWorld_打印HelloWorld_

    这个"HelloWorld_"项目正是这样一个入门实例,用于在Visual Studio这个强大的集成开发环境中展示基本的代码编写和运行流程。 首先,让我们了解什么是Visual Studio。Visual Studio是由微软开发的一款全面的开发工具...

    Helloworld_helloworld_

    这个简单的程序通常只包含一行代码,用于在控制台上打印出 "Hello, World!" 这个字符串。在这个场景中,我们看到的"HelloWorld_helloworld_"可能是某种编程教程或示例项目的名称,它似乎旨在展示如何在不同情况下...

    hello world hello world

    标签“hello world”进一步强化了这个主题,可能意味着我们将关注编程学习、代码编写和编程语言的基本概念。 考虑到压缩包子文件的文件名称为“BookShop”,我们可以推测这是一个与书店或图书管理相关的项目。这...

    GCC实例:打印 Hello World.pdf

    执行`./hello`命令,程序将在终端中打印出"Hello World"。 GCC提供了许多选项和参数,例如`-c`选项用于仅编译不链接,`-o`选项用于指定输出的可执行文件名。在实际开发中,这些选项可以帮助开发者实现更复杂的编译...

    abc 联系代码hello world hello world

    在不同的编程语言中,"hello world"程序的写法会有所不同,但其目的都是打印出"Hello, World!"这个简单的字符串。 在实际项目中,我们可能会遇到类似"Project開發信息・管理記録(2010年度)"这样的文档,这可能是...

    Hello_World.zip_hello world _world

    这个简单的程序是许多编程语言教学的第一课,用于向初学者介绍如何在代码中打印出“Hello, World!”这个字符串,以此来验证编译环境的正确配置和基础语法的理解。 在IT领域,“Hello, World!”程序的重要性不言而喻...

    CCS hello world打印.rar

    此代码的作用是在标准输出设备(通常是控制台)上打印出"Hello, World!"字符串。 2. **输出结果图**:这可能是一个截图,展示了在CCS中运行程序后控制台的输出结果。当成功编译并运行上述代码时,用户将在终端看到...

    基于microblaze的流水灯及打印helloworld

    至于“打印Hello World”,这是任何编程语言入门的第一步。在Microblaze环境下,我们需要编写一个简单的C程序,包含标准输入输出库,调用`printf`函数打印出"Hello World"字符串。这个程序将在Microblaze处理器上...

    Hello world

    这会打印出“Hello World!”到控制台。 6. **编译与运行**:在命令行中,先使用`javac HelloWorld.java`编译源代码,生成`HelloWorld.class`字节码文件。然后,通过`java HelloWorld`运行程序,你会看到“Hello ...

    各种语言的Helloworld编程

    这个简单的程序通常在控制台上打印出 "Hello, World!" 这个短语,以此来验证编译环境和基本语法的正确性。它的起源可以追溯到 Brian Kernighan 和 Dennis Ritchie 合著的《The C Programming Language》一书,书中...

    helloworld.zip

    这段代码会打印出"Hello, World!",这是编程领域的一个传统,用于验证一个新的编程环境是否已经正确设置,并且能够正常运行简单的程序。 总的来说,"helloworld.zip"包含的资源对于任何刚开始接触编程的人来说都是...

    C语言蛋疼的Hello World代码

    标题中提到的“蛋疼的Hello World代码”暗示了这是一段非常规且复杂的实现方式,通常用于学习C语言中的指针、内存操作等高级概念。 #### 描述解析 描述部分展示了一段通过指针和内存操作来打印“Hello World”的...

    m8 hello world 源代码吗?

    这段代码在执行时会在控制台上打印出“Hello, World!”。在.NET Compact Framework中,`Console.WriteLine`方法用于向控制台输出一行文本,这里是我们的“Hello, World!”消息。 通过分析上述信息,我们可以了解到...

    一个简单的Delphi控制台应用程序,它打印出"Hello, World!"

    这一行代码定义了程序的名字为`HelloWorld`。在Delphi中,每个程序都需要有一个唯一的名称来标识它。 ##### 2. 指定应用程序类型 ```pascal {$APPTYPE CONSOLE} ``` 使用编译器指令`{$APPTYPE CONSOLE}`来指定当前...

    IEDA helloworld 代码

    这段代码定义了一个公共类 "HelloWorld",其中包含一个主方法 "main",这是Java程序的入口点。`System.out.println` 语句用于在控制台打印 "Hello, World!"。 5. **运行程序**:在代码编辑器中,将光标放在 "main" ...

    masm汇编helloworld模板

    在`HelloWorld.asm`中,我们可能会看到类似以下的代码片段,用于打印"Hello, World!": ```assembly section .data hello db 'Hello, World!',0 section .text global _start _start: ; 设置段寄存器 mov ax,...

    编写 hello world web 程序

    ### 编写 Hello World Web 程序 #### 任务目标 本任务旨在通过一系列步骤指导初学者如何创建一个简单的 Node.js 程序,并在命令行中输出 "Hello World!" 文本。此过程不仅涉及基本的文件系统操作,还包括了 Node.js...

    HelloWorld

    这个简单的程序在各种编程语言中的实现都大同小异,主要目的是为了让新手了解如何在计算机上打印出“Hello, World!”这句话,从而熟悉编程环境的基本操作。 在编程世界里,"Hello, World!"程序的编写标志着一个...

    最简单的委托与事件源代码(HelloWorld)

    3. 在我们的"HelloWorld"示例中,`HelloWorld`类通过`SayHello`事件发布消息,而`Program`类订阅这个事件并提供响应方法。 学习并掌握委托和事件是理解C#面向对象编程和事件驱动编程的基础,这将有助于你构建更加...

    我的第一个JSP之helloworld

    【标题】"我的第一个JSP之helloworld"揭示了这个主题是关于初学者入门JSP(JavaServer Pages)编程,并通过一个经典的“Hello, World!”示例进行介绍。JSP是一种动态网页技术,允许开发者在HTML中嵌入Java代码,以...

Global site tag (gtag.js) - Google Analytics