【问题标题】:How to create a bit array in common lisp?如何在 common lisp 中创建位数组?
【发布时间】:2020-11-01 01:58:45
【问题描述】:
在谷歌上搜索了大约一个小时后,我不得不承认,虽然我找到了很多关于在位数组上操作的函数的文档,但我找不到关于如何实际创建位数组的单一参考。
现在,在我看来,一些具有其他元素类型的数组可以作为位数组处理,或者可以使用(make-array :element-type (???)) 在那里我找不到任何关于在我写的地方放什么的解释“ ???”。
因此,尽管对其他人来说可能很明显,但我不知道如何创建位数组。我知道如何编写一个文字位数组 - 但如果我需要一个位数组,比如 2^16 位 - 我该怎么做?
【问题讨论】:
标签:
common-lisp
sbcl
bitarray
【解决方案1】:
使用make-array 是对的,只需使用'bit 作为元素类型。尝试
(make-array initial-size :element-type 'bit)。
符号BIT 命名位类型,并且可以用任何其他类型说明符替换以创建包含该类型对象的数组。在此示例中,initial-size 只是一个包含整数的变量。
【解决方案2】:
另一种创建位向量的方法:
> (make-sequence '(vector bit) 10)
#*0000000000
【解决方案3】:
还有一个使用 #* 阅读器宏的文字语法,请注意使用 make-array 和 make-sequence 之间的具体类型可能会有所不同,但我不确定性能是否会有所不同...
用 SBCL 测试:
CL-USER> (defvar arr (make-array 10 :element-type 'bit :fill-pointer 0))
ARR
CL-USER> (type-of arr)
(VECTOR T 10)
CL-USER> (defvar arr3 (make-sequence '(vector bit) 10))
ARR3
CL-USER> (type-of arr3)
(SIMPLE-BIT-VECTOR 10)
CL-USER> (type-of #*0101010100)
(SIMPLE-BIT-VECTOR 10)