在 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 字节进行掩码,将替换内容向左移动并按位或进行运算。)但对于任何询问“最佳方式”的问题,答案是尝试不同的选项并对它们进行基准测试。不同的编码可能对不同的问题表现更好。
假设您有一个 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 字节进行掩码,将替换内容向左移动并按位或进行运算。)但对于任何询问“最佳方式”的问题,答案是尝试不同的选项并对它们进行基准测试。不同的编码可能对不同的问题表现更好。