首页 > 解决方案 > 提取十六进制值的第 n 位

问题描述

假设我有一个表示十六进制值的字符串,例如“0x4”,二进制表示为 0100。如果我想测试第 n 位是否设置为 1,以及从最低有效位开始计数的位置(在此示例中意味着只有第 3 位是 1)我怎样才能以最优雅的方式做到这一点?

我怀疑我正在做的方式非常优雅或高效。bits = '{0:08b}'.format(int(0x4, 16)) 然后检查 str(bits[-3]) 是否为“1”

bits = '{0:08b}'.format(int(0x4, 16))
if str(bits[-3]) == "1":
    print "Bit is set to 1"

我想要一种巧妙的方法,例如使用按位运算符或移位。

标签: python

解决方案


要测试是否设置了某个位,请在该位&的位掩码上按位使用:

>>> bool(12 & 0b0100)
True

要在第 n 个位置设置位掩码,请将 a1n-1位置移位:

>>> n = 3
>>> 1 << n-1
4
>>> bin(1 << n-1)
'0b100'

结合起来,可以直接检查是否设置了特定位:

>>> def bitset(number, n):
...     """Test whether ``number`` has the ``n``'th bit set"""
...     return bool(number & 1 << n - 1)
...
>>> bitset(0x4, 3)

如果您的输入是一个字符串(而不是从一个整数生成一个字符串),使用int它来转换它:

>>> bitset(int('0x4', 16), 3)

推荐阅读