如何在普通isp中(zerop #*000)?

有没有一种有效的方法来检查一个比特向量是否都是零?(我在Linux上使用的是SBCL。)我看了文档,但找不到合适的函数。到目前为止,我想出的最好的方法是。

(defun bit-zerop (array)
  (equal array (make-array (length array) :element-type 'bit)))

(bit-zerop #*000)

我也试过

(defun bit-zerop (array)
  (dotimes (i (length array))
    (if (eql (sbit array i) 1)
        (return-from bit-zerop nil)))
  t)

但在较大的位向量上比第一个版本慢了100倍。这也是意料之中的,因为每个64位的字要读64次,我想,而不是只读一次)。当然,第一个版本也是次优的,因为它必须分配一个新的数组。

EDIT: 上述解决方案的时间安排

EDIT 2: 类型声明的时间.

(defun bit-zerop-1 (array)
  ;; (declare (simple-bit-vector array))
  (equal array (make-array (length array) :element-type 'bit)))

(defun bit-zerop-2 (array)
  ;; (declare (simple-bit-vector array))
  (every #'zerop array))

(defun bit-zerop-3 (array)
  ;; (declare (simple-bit-vector array))
  (loop
     for bit across array
     never (= bit 1)))

(defun bit-zerop-4 (array)
  ;; (declare (simple-bit-vector array))
  (not (find 1 array)))

(dolist (func '(bit-zerop-1 bit-zerop-2 bit-zerop-3 bit-zerop-4))
  (dolist (size '(10 100 1000))
    (let ((x (make-array size :element-type 'bit)))
      (format t "Testing ~a on ~a elements~%" func size)
      (time
       (dotimes (i 1000000)
         (funcall func x))))))

给出

 030 s 0.030 s 0.058 sbit-zerop-2 0.112 s 1.000 s 9.324 sbit-zerop-3 0.111 s 0.935 s 8.742 sbit-zerop-4 0.  315 sbit-zerop-3 0.041 s 0.348 s 3.346 sbit-zerop-4 0.010 s 0.012 s 0.026 s==============================================。

解决方案:

这里有一个选项。

(defun bit-vector-zerop (bit-vector)
  (not (find 1 bit-vector)))

这不会产生弊端,而且在SBCL上非常有效。如果你能把参数声明为一个位向量,速度会更快。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Vue-Konva。有没有办法在飞行中重新排列图层?

2022-4-22 18:08:47

解决方案

在Datagridview中显示学生名单

2022-4-22 18:08:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索