Nat*_*ell 5 bit-manipulation apl
我们需要制作一个程序来模拟我的计算机体系结构类的IEEE浮点数的划分.我几乎已经完成了这个,但我认为看看程序在APL中会是什么样子会很有趣,但据我所知,在APL中没有(直接)方式进行按位操作(按位和/或,转移等...).如果可能,在APL中执行此操作的最简单方法是什么?
在APL中干净(=您想要使用的方式)的方式是:
步骤1和3非常简单:APL有两个转换运算符编码(⊤)和解码(⊥).位向量只是一种特殊情况; 运算符使用任意基数(包括十六进制).
例子:
? convert 13 to 4-bit vector. The number of 2s is the result length
2 2 2 2 ? 13
1 1 0 1
2 ? 1 1 0 1 ? convert back
13
Run Code Online (Sandbox Code Playgroud)
APL程序员不会写2 2 2 2来指示结果向量的所需长度,而是(4⍴2).这是因为对于longer的较长参数(在您的情况下为64),代码更具可读性.
负整数有点棘手,因为有不同的格式,如1补码或2补码.⊤和⊥工作,但你必须要小心.
⊤和⊥提供了一些很酷的东西.首先,您可以一次转换多个数字:
2 2 2 2 ? 1 2 3
0 0 0
0 0 0
0 1 1
1 0 1
Run Code Online (Sandbox Code Playgroud)
接下来,如前所述,它们适用于其他基数,如16,用于十六进制结果:
16 16 16 16 ? 50000
12 3 5 0
Run Code Online (Sandbox Code Playgroud)
结果是数字,因此您可能希望将其转换为字符:
'0123456789ABCDEF'[?IO+16 16 16 16?50000]
C350
Run Code Online (Sandbox Code Playgroud)
最棘手的情况是浮点数(也因此也是复数).
大多数APL解释器具有系统功能,例如APL68000中的⎕DR或GNU APL中的27⎕CR.⎕DR直接返回二进制向量,而GNU APL中的27⎕CR将64位IEEE浮点数转换为64位2s补码整数,然后可以如上所述进行转换.
将数字转换为位向量后,其余的很简单: