【问题标题】:Extracting nth bit in hexadecimal value提取十六进制值的第 n 位
【发布时间】:2020-01-15 06:25:40
【问题描述】:

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

我怀疑我的做法是否非常优雅或高效。 位 = '{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


    【解决方案1】:

    您可以使用bin() 函数将整数转换为二进制字符串:

    >>> n = int('0x4', 16)
    >>> n
    4
    >>> bin(n)
    '0b100'
    >>> bin(n)[-3] == '1'
    True
    

    更有效的方法是直接使用位运算符对整数进行操作:

    >>> bool(n & 1<<2)  # shift "1" 2 bits to the left and use bitwise and
    True
    

    【讨论】:

      【解决方案2】:

      通常你会为此使用bitwise operators

      if 4 & 1 << n:
          print('Bit', n, 'is set')
      

      【讨论】:

        【解决方案3】:

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

        >>> bool(12 & 0b0100)
        True
        

        要在第 n 个位置设置位掩码,请将1 位移n-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)
        

        【讨论】:

          【解决方案4】:

          你可以使用:

          def check_nth_bit(str_hex, nth_bit):
              return (int(str_hex, 16) & 2 **(nth_bit - 1)) >> (nth_bit - 1) == 1
          
          print(check_nth_bit('0x4', 3))
          print(check_nth_bit('0x4', 1))
          

          输出:

          True
          False
          

          【讨论】:

            猜你喜欢
            • 2014-02-18
            • 1970-01-01
            • 2022-09-26
            • 2018-07-26
            • 1970-01-01
            • 1970-01-01
            • 2015-07-04
            • 2014-12-14
            • 1970-01-01
            相关资源
            最近更新 更多