在 BitVectors 中设置位域

Setting bit fields in BitVectors

假设您有一个 64 位的 BitVector 并且想要用其他值表示第 8 位到第 15 位的替换。哪种方法最有效?

最好的方法是将顶部和底部部分提取出来,直接在里面拼接替换件。像这样:

(set-option :produce-models true)
(set-logic QF_BV)

(declare-fun original    () (_ BitVec 64))
(declare-fun replacement () (_ BitVec 8))

(define-fun result () (_ BitVec 64) (concat ((_ extract 63 16) original)
                                            replacement
                                            ((_ extract 7 0) original)))

(assert (= (bvadd original #x0000000000000100) result))
(check-sat)
(get-value (original replacement result))

这会打印:

sat
((original #x0000000000000000)
 (replacement #x01)
 (result #x0000000000000100))

请注意,移位和屏蔽的替代方法也可以工作,但根据我的经验,如果可以的话,避免算术是一种可行的方法。 (也就是说,在正确的位置用 0 字节进行掩码,将替换内容向左移动并按位或进行运算。)但对于任何询问“最佳方式”的问题,答案是尝试不同的选项并对它们进行基准测试。不同的编码可能对不同的问题表现更好。