Pack numbers into a bitset (python,bitwise operations)

无人久伴 提交于 2019-12-01 14:00:48

问题


The PIC microcontroller has a dead simple instruction set format. Each instruction is exactly 14 bits long, composed of a variety of numbers at differing bit lengths.

I am trying to build a function that can take all these inputs and build a number that represents that instruction.

This is what I have been trying to get working:

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

print "FIN:", bin(fileRegOp(1,True,15))

It outputs

FIN: 0b10000010001111

Which looks good, except the bits are the wrong way round. I think it should read:

FIN: 0b00000111111000

I've seen solutions on SO that involve loops to flip the bits around, but I'm sure there's a better way.

Whats the most elegant way to write this function?

More detail on the instruction set: Datasheet see page 121,122


回答1:


Your shifts are wrong.

You are shifting by the index of the top-most bit, which isn't right. You must shift by the index of the lowermost (rightmost) bit in each field.

So it should be:

def fileRegOp(opcode, d, f):
  return (opcode << 8) | (d << 7) | f

This gives, with some editing to add padding zeros on the left:

>>> bin(fileRegOp(1,True,15))
'0b00000110001111'

Of course, it might be sensical to also limit-check the arguments.



来源:https://stackoverflow.com/questions/27317564/pack-numbers-into-a-bitset-python-bitwise-operations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!