Python Z3py-做一个滚动

Python Z3py-做一个滚动,python,z3,smt,Python,Z3,Smt,有没有一种推荐的方法可以按任意数量向左或向右进行位滚动 例如,使用字节-0x57 rolr 3=0xEA 我在Z3py文档中没有发现任何“滚动”操作。我曾考虑对每一位使用BitVecs,但这似乎没有效率/可能不会起作用。谢谢你的建议 编辑:谢谢你的回答。这更像是一个API问题,因为我现在很烂。这是我的出发点 def roll(bt): count = BitVecVal(int('0x03', 16), 8) s.add(bt == (bt << count | bt >>

有没有一种推荐的方法可以按任意数量向左或向右进行位滚动

例如,使用字节-
0x57 rolr 3=0xEA

我在Z3py文档中没有发现任何“滚动”操作。我曾考虑对每一位使用
BitVec
s,但这似乎没有效率/可能不会起作用。谢谢你的建议

编辑:谢谢你的回答。这更像是一个API问题,因为我现在很烂。这是我的出发点

def roll(bt):
count = BitVecVal(int('0x03', 16), 8)
s.add(bt == (bt << count | bt >> (8 - count)) & 0xFF)

a = BitVec('a', 8)
s = Solver()
roll(a)
s.add(a == BitVecVal(int('0xEA', 16), 8))
s.check()
def辊(bt):
计数=位向量值(int('0x03',16),8)
s、 添加(bt==(bt>(8-计数))&0xFF)
a=比特向量('a',8)
s=解算器()
滚动(a)
s、 add(a==BitVecVal(int('0xEA',16),8))
s、 检查()

这不会打印任何内容,并且模型不可用。

您可以执行如下旋转:

size = 0x100  # size of the bitvector

rotated = (x << n) | (x >> (size - n)) & (size - 1)
size=0x100#位向量的大小
旋转=(x>(大小-n))和(大小-1)

与?
>
不同的是算术移位。这就是它不起作用的原因。下面是一个带有示例的链接:顺便说一句,Z3Py具有以下功能:
RotateLeft
RotateRight
。py模块有一堆pydoc注释。这是doxygen制作的在线API参考指南:@LeonardoeMoura此代码没有打印任何内容,是否有错误
a=BitVec('a',8)
s=Solver()
s.add(RotateLeft(a,3)==BitVecVal(int('0xEA',16),8))
s.check()
s.model()
您必须添加
print
。下面是您的打印示例链接:Eric,您的解决方案几乎是正确的。问题在于,Z3Py中的
是算术移位。对于逻辑移位,我们必须使用函数
LShR
。我们可以在网上@LeonardoeMoura尝试一下:因此在最后是
&(size-1)
。尝试我在回答中所写的:@LeonardodeMoura:事实上,我不知道这段代码为什么有效。如果设置了x的最高位,那么
(x>>(size-n))
不会用1s填充所有高位吗?埃里克:没错,
(x>>(size-n))
会用1s填充高位。这就是为什么我说这是不正确的。我们可以通过使用
(1@LeonardodeMoura:我不知道我在想什么。当我写
(size-1)
时,我的意思是
(1