python取数字中的一位_从Python中的int中提取位域

我有一个像0x5423的数字,我想提取4个值:

a = 0x5 # 15 downto 12

b = 0x42 # 11 downto 3

c = 0x3 # 3 downto 2

d = 0x00 # 1 downto 0

我发现模块bitstrings看起来很棒.不幸的是,由于未知原因,这些位从右侧开始编号.

这很糟糕,因为如果添加一些高位如0xA5423我的提取将不再起作用:

field = bitstrings.BitArray('0x5423')

a = field[0:4].uint

b = field[4:12].uint

c = field[12:14].uint

d = field[14:16].uint

如何在没有复杂算术操作的情况下正确提取我的位域,例如:

b = (a >> 4) & 0xFF

理想情况下我会:

b = field.range(11, 4)

最佳答案 在传递给bitstring.BitArray之前,将字符串转换为0x ####格式:

>>> n = '0xA5423'

>>> n = '0x{:04x}'.format(int(n, 16) & 0xffff) # => '0x5423'

>>> field = bitstring.BitArray(n)

>>> field[0:4].uint

5

>>> field[4:12].uint # 0x42 == 66

66

>>> field[12:14].uint

0

>>> field[14:16].uint

3

更新另一个不依赖于bitstring的解决方案,并从左计数(根据OP):

将数字转换为二进制格式:

>>> n = '0xA5423'

>>> n = format(int(n, 16), '016b')[::-1] # reversed

>>> n

'11000100001010100101'

>>> int(n[0:2][::-1], 2) # need to reverse again to get proper value

3

>>> int(n[2:4][::-1], 2)

0

>>> int(n[4:12][::-1], 2)

66

>>> int(n[12:16][::-1], 2)

5

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值