簡體   English   中英

如何在 common lisp 中創建位數組?

[英]How to create a bit array in common lisp?

在谷歌搜索了大約一個小時后,我不得不承認,雖然我找到了很多關於在位 arrays 上運行的函數的文檔,但我找不到關於如何實際創建位數組的單一參考。

現在,在我看來,一些具有其他元素類型的 arrays 可以作為位 arrays 處理,或者可以使用(make-array:element-type (???))我找不到任何解釋在我寫“???”的地方放什么。

因此,盡管對其他人來說可能很明顯,但我不知道如何創建位數組。 我知道如何編寫一個文字位數組 - 但如果我需要一個位數組,比如 2^16 位 - 我該怎么做?

您使用make-array是對的,只需使用'bit作為元素類型。 嘗試(make-array initial-size:element-type 'bit) 符號BIT命名位類型,並且可以用任何其他類型說明符替換以創建一個包含該類型對象的數組。 在此示例中initial-size只是一個包含整數的變量。

另一種創建位向量的方法:

> (make-sequence '(vector bit) 10)
#*0000000000

還有一個使用#*閱讀器宏的文字語法,並注意使用make-arraymake-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)

這個怎么樣:

  • (setq x 10)
  • 10
  • (setq y (read-from-string (format nil "#*~7,'0b" x)))
  • #*0001010
  • 7 是任意長度,可以通過以下方式設置
  • (setq z 8)
  • 8
  • (setq y (read-from-string (format nil (concatenate 'string "#*~" (write-to-string z) ",'0b") x)))
  • #*00001010
  • 較大的位數組可以更好地處理為無符號 integer。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM