APL中的按位操作?

Nat*_*ell 5 bit-manipulation apl

我们需要制作一个程序来模拟我的计算机体系结构类的IEEE浮点数的划分.我几乎已经完成了这个,但我认为看看程序在APL中会是什么样子会很有趣,但据我所知,在APL中没有(直接)方式进行按位操作(按位和/或,转移等...).如果可能,在APL中执行此操作的最简单方法是什么?

Jür*_*ann 9

在APL中干净(=您想要使用的方式)的方式是:

  1. 将数字转换为位向量(或位矩阵或更高维度的APL值),
  2. 对位向量进行移位旋转等操作
  3. 转换回数字

步骤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补码整数,然后可以如上所述进行转换.

将数字转换为位向量后,其余的很简单:

  1. 用于访问各个位的索引([])
  2. 取(↑)并放下(↓)换位
  3. 旋转(⊖或⌽)旋转位
  4. 二进制运算的布尔函数和/或/ Nand/Nor/Not(∧∨⍲⍲和〜).