将数字打包到bitset(python,按位运算)

64b*_*uid 0 python bit-manipulation pic bit

PIC单片机具有简单的指令集格式.每条指令正好是14位长,由不同位长的各种数字组成.

我正在尝试构建一个可以接受所有这些输入并构建表示该指令的数字的函数.

指令集格式

这就是我一直努力工作的原因:

def fileRegOp(opcode, d, f):
    out =  opcode << 13
    out = out | d << 7
    out = out | f
    return out

print "FIN:", bin(fileRegOp(1,True,15))
Run Code Online (Sandbox Code Playgroud)

它输出

FIN:0b10000010001111

哪个看起来不错,除了比特是错误的方式.我认为它应该是:

FIN:0b00000111111000

我已经看到SO上的解决方案涉及循环翻转位,但我相信有更好的方法.

什么是最优雅的方式来编写这个功能?

有关指令集的更多详细信息:数据表,请参见第121,122页

unw*_*ind 5

你的转变是错误的.

你正在移动最顶部的索引,这是不对的.您必须按每个字段中最低(最右边)位的索引进行移位.

所以它应该是:

def fileRegOp(opcode, d, f):
  return (opcode << 8) | (d << 7) | f
Run Code Online (Sandbox Code Playgroud)

这给了一些编辑,在左边添加填充零:

>>> bin(fileRegOp(1,True,15))
'0b00000110001111'
Run Code Online (Sandbox Code Playgroud)

当然,限制检查参数可能也是合理的.