APL中的按位操作?

时间:2015-04-18 15:33:07

标签: bit-manipulation apl

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

2 个答案:

答案 0 :(得分:9)

干净(=您想要使用的方式)在APL中执行此操作的方法是:

  1. 将数字转换为位向量(或位矩阵或更高维度 APL值),
  2. 对位向量进行移位旋转等操作,
  3. 转换回数字
  4. 步骤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
    

    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
    

    接下来,正如已经说过的那样,它们适用于其他基数,例如16,用于十六进制结果:

          16 16 16 16 ⊤ 50000
    12 3 5 0
    

    结果是数字,因此您可能希望将其转换为字符:

          '0123456789ABCDEF'[⎕IO+16 16 16 16⊤50000]
    C350
    

    最棘手的情况是浮点数(也因此也是复数)。

    大多数APL解释器具有系统功能,例如APL68000中的⎕DR或GNU APL中的27⎕CR。 ⎕DR直接返回二进制向量,而GNU APL中的27⎕CR将64位IEEE浮点数转换为64位2s补码整数,然后可以如上所述进行转换。

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

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

答案 1 :(得分:1)

根据您的APL系统,这是一种不干净方式。一些APL系统具有[] DR系统功能,允许快速且松散的方式将变量的内容从一种数据类型转换为另一种数据类型。如果你有Dyalog APL(可能这将在APL2000中工作),试试这个:

      )CLEAR
      []IO := 0  // sorry, no APL chars
      []PP := 16
      a := 11 []DR 7.42  // 11 means "type number 1, boolean, 1 bit"
      a
1 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0
      a[42]
1
      a[42] := 0
      645 []DR a   // 645 means "type number 5, double, 64 bit"
7.388750000000003
      )CLEAR

这里[] DR执行将浮点数转换为位向量的困难部分,然后再返回。 (这可能正是您需要在计算机体系结构课程中学习的内容,但检查答案并不是一种糟糕的方法)

警告:使用此技术,您可以构造不是有效浮点数的值。这可能会导致解密器,系统崩溃或留下可能导致问题的某些问题。在试验后一定要)CLEAR