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
分享到:
相关推荐
• 在命令行打印 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....
这段代码定义了一个名为HelloWorld的公共类,其中包含一个名为main的公共静态方法。在main方法中,使用System.out.println语句打印出了"Hello World!"这个字符串。 这个程序的执行结果是在控制台输出"Hello World!...
HELLO WORLD非常适合CCS入门学习,文件附有程序代码,运行以及输出结果图,欢迎大家前来参考。
使用STM32F407的HAL库只需1行代码实现USART1串口打印“Hello World!”,下面我将详细解释STM32CubeMX配置步骤和程序,打印“Hello World!”。一旦程序烧录完成并运行,串口助手一直在打印“Hello World!”。如果...
我的第一个JSP之helloworld! 输出helloworld的四中方式。 有详细的图片!
Python打印hello world 程序详解;Python打印hello world程序是最简单的一个学习程序了;这里先演示python3的使用;再贴出python2的使用代码,可以对比二者的区别
一共6个程序,所有的程序的目的都只有一个:打印出Helloworld! 看你能看懂几个! 注:前5个用C语言编译器即可,最后一个需要使用C++的编译器。 代码1到5在DJGPP下编译通过,代码6使用VC6的cl.exe编译通过。
一个使用x86汇编语言实现的一个helloworld字符串的打印输出
Matlab集成的c代码你好,世界 所有可能的编程语言中的Hello World 目标 该存储库最终以所有可能的编程语言包含了著名的“ Hello World”程序。...使用HelloWorld.extension of your programming language文件
matlab打印代码不同的Hello World程序 贡献之前查看文件。 Python print ( 'Hello World!' ) C # include < stdio.h > void main () { printf ( " Hello World! " ); } C ++ # include < iostream > using ...
java 入门代码,Helloworld,包涵有一个完整的代码示例,有一个完整的java类的示例和一个完整的java方法定义示例,还有一个静态库方法System.out.println调用打印一个字符串的示例。帮助您写出第一个java代码。hello...
C6678程序计时代码,已上板验证。在验证时可以设置断点,运行程序的同时进行手机计时,以便验证其正确性
现在,要打印“ 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
新建一个记事本,输入如下代码,另存为HelloWorld.txt. using System; namespaceHelloWorld { classProgram { static voidMain(string[] args) { Console.WriteLine(Hello World!); Console.ReadKey();
代码:public class HelloWorld{ //第二行的内容是万年不变的固定写法,代表main方法 //这一行代表程序执行的起点 Public static void main(String[] args){ //第三行代表打印输出语句(其实就是...
linux 编程、入门和提高.创建一块共享内存区;创建信号量并增加它的值;创建和打开消息队列.向队列中写入消息;控制和删除信号量;附加共享内存区等等....
matlab最简单的代码 :nerd_face: 你好,世界 这个书呆子的GitHub存储库被设计为所有编程语言的集合。 因此,在使项目工作时,我们打算在编译之间遵循以下主要规则: 以NotImplemented命名的文件是Hello, world!示例...
这个傻瓜安装,next就完事了。 有一点,需要注意,安装的时候,会提示安装各种库,要记住勾选C和C++的库文件 三、启动 当然,首先创建新项目: 作为新手我们创建: 四、操作 对于使用c语言的我们这些没有用: 全部...
该文档介绍了在keil环境下基于LPC11C14芯片的项目工程建立
只需编辑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 这...