`
MouseLearnJava
  • 浏览: 459824 次
  • 性别: 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
分享到:
评论

相关推荐

    编写 hello world web 程序

    • 在命令行打印 hello world! 字符 //mkdir nodejs-demo //cd nodejs-demo // https://sample.wangding.in/nodejs/tern-project //mv tern-project .tern-project //mkdir 01-introduction //touch 01-hello-world....

    Java最开始的helloworld

    这段代码定义了一个名为HelloWorld的公共类,其中包含一个名为main的公共静态方法。在main方法中,使用System.out.println语句打印出了"Hello World!"这个字符串。 这个程序的执行结果是在控制台输出"Hello World!...

    CCS hello world打印.rar

    HELLO WORLD非常适合CCS入门学习,文件附有程序代码,运行以及输出结果图,欢迎大家前来参考。

    STM32 HAL库只需1行代码实现USART串口打印Hello World

    使用STM32F407的HAL库只需1行代码实现USART1串口打印“Hello World!”,下面我将详细解释STM32CubeMX配置步骤和程序,打印“Hello World!”。一旦程序烧录完成并运行,串口助手一直在打印“Hello World!”。如果...

    我的第一个JSP之helloworld

    我的第一个JSP之helloworld! 输出helloworld的四中方式。 有详细的图片!

    Python打印hello world 程序详解

    Python打印hello world 程序详解;Python打印hello world程序是最简单的一个学习程序了;这里先演示python3的使用;再贴出python2的使用代码,可以对比二者的区别

    混乱C语言代码之HelloWorld版

    一共6个程序,所有的程序的目的都只有一个:打印出Helloworld! 看你能看懂几个! 注:前5个用C语言编译器即可,最后一个需要使用C++的编译器。 代码1到5在DJGPP下编译通过,代码6使用VC6的cl.exe编译通过。

    MASM_masmhellloworld_汇编语言helloworld_

    一个使用x86汇编语言实现的一个helloworld字符串的打印输出

    matlab集成c代码-Hello-World:以所有可能的编程语言打印HelloWorld

    Matlab集成的c代码你好,世界 所有可能的编程语言中的Hello World 目标 该存储库最终以所有可能的编程语言包含了著名的“ Hello World”程序。...使用HelloWorld.extension of your programming language文件

    matlab打印代码-hello-worlds:你好世界

    matlab打印代码不同的Hello World程序 贡献之前查看文件。 Python print ( 'Hello World!' ) C # include &lt; stdio.h &gt; void main () { printf ( " Hello World! " ); } C ++ # include &lt; iostream &gt; using ...

    java Hello world

    java 入门代码,Helloworld,包涵有一个完整的代码示例,有一个完整的java类的示例和一个完整的java方法定义示例,还有一个静态库方法System.out.println调用打印一个字符串的示例。帮助您写出第一个java代码。hello...

    HELLO_WORLD(timer).zip

    C6678程序计时代码,已上板验证。在验证时可以设置断点,运行程序的同时进行手机计时,以便验证其正确性

    maven-hello-world:简单,最小的Maven示例:hello world

    现在,要打印“ Hello World!”,请输入... cd my-app mvn compile java -cp target/classes com.mycompany.app.App 或者... cd my-app mvn package java -cp target/my-app-1.0-SNAPSHOT.jar com.my

    不用IDE写C#的Hello World的方法

    新建一个记事本,输入如下代码,另存为HelloWorld.txt. using System; namespaceHelloWorld { classProgram { static voidMain(string[] args) { Console.WriteLine(Hello World!); Console.ReadKey();

    HelloWorld实例

    代码:public class HelloWorld{ //第二行的内容是万年不变的固定写法,代表main方法 //这一行代表程序执行的起点 Public static void main(String[] args){ //第三行代表打印输出语句(其实就是...

    linux 编程技术

    linux 编程、入门和提高.创建一块共享内存区;创建信号量并增加它的值;创建和打开消息队列.向队列中写入消息;控制和删除信号量;附加共享内存区等等....

    matlab最简单的代码-HelloWorld:编程语言集

    matlab最简单的代码 :nerd_face: 你好,世界 这个书呆子的GitHub存储库被设计为所有编程语言的集合。 因此,在使项目工作时,我们打算在编译之间遵循以下主要规则: 以NotImplemented命名的文件是Hello, world!示例...

    c语言之Visual studio开发教程(一)建立C项目并且打印helloworld

    这个傻瓜安装,next就完事了。 有一点,需要注意,安装的时候,会提示安装各种库,要记住勾选C和C++的库文件 三、启动 当然,首先创建新项目: 作为新手我们创建: 四、操作 对于使用c语言的我们这些没有用: 全部...

    新建一个keil

    该文档介绍了在keil环境下基于LPC11C14芯片的项目工程建立

    helloWorld

    只需编辑hello.cpp即可删除打印的“ C方式”。 原始代码输出: Hello, World, I'm back in C land. Hello, World! I've upgraded to C++ 更新后的版本应该只输出: Hello, World! I've upgraded to C++ 问题2 这...

Global site tag (gtag.js) - Google Analytics