Индексировать элемент BitVe c в Z3Py - PullRequest
2 голосов
/ 15 марта 2020

Есть ли способ индексировать элемент в BitVec? Я хотел бы что-то вроде этого:

s = Solver()
x = BitVec('x', 8)
s.add(Not(And(x[0], x[2])))

Или маскирует единственный способ изолировать биты:

s.add(x & 5 != 5)

1 Ответ

3 голосов
/ 15 марта 2020

Вы можете использовать Extract(high, low, a) для извлечения одного или нескольких битов из типа BitVec.

например,

from z3 import *

s = Solver()
x = BitVec("x", 8)

x_0 = Extract(0, 0, x)
x_2 = Extract(2, 2, x)

expr = Or(x_0 == 0, x_2 == 0)

s.add(expr)

while s.check() == sat:
    m = s.model()
    print("Model: " + str(m))

    v_0 = m.eval(x_0)
    v_2 = m.eval(x_2)

    bl = Or(x_0 != v_0, x_2 != v_2)

    s.add(bl)

Выход:

Model: [x = 4]    # 0000 0100
Model: [x = 0]    # 0000 0000
Model: [x = 1]    # 0000 0001
...