【问题标题】:Getting a specific bit value in a byte string获取字节字符串中的特定位值
【发布时间】:2011-02-05 04:42:51
【问题描述】:

在一个字节串的特定索引处有一个字节,代表八个标志;字节中的每一位一个标志。如果设置了标志,则其对应位为 1,否则为 0。例如,如果我有

b'\x21'

标志是

0001 0101    # Three flags are set at indexes 0, 2 and 4
             # and the others are not set

获取该字节中每个位值的最佳方法是什么,以便我知道是否设置了特定标志? (最好使用按位运算)

【问题讨论】:

    标签: python binary byte


    【解决方案1】:

    通常,最低有效位是位索引 0,最高有效位是位索引 7。使用此术语,我们可以通过按位与 1 向左移动来确定位索引 k 是否设置由 k。如果按位和非零,则表示索引 k 为 1;否则,索引 k 为 0。所以:

    def get_bit(byteval,idx): 返回 ((byteval&(1

    这将正确确定字节索引 0...7 处的位值,从右到左(即最低有效位到最高有效位,或等效地从 1 到 2 7 = 128 位)。

    为什么会起作用
    我想我应该添加一个解释为什么它有效......

    1 1 1

    如您所见,1k,并且在我们感兴趣的索引处包含 1,而在其他位置则没有。因此,按位与 1

    【讨论】:

    • 感谢您提供的信息丰富的答案,这很有意义。你实际上是对的,在这种情况下,最低有效位在索引 0 处。
    【解决方案2】:

    x & 1、x & 2、x & 4、x & 8 等

    如果 >0 则设置位 1、2、3、4 等

    【讨论】:

      【解决方案3】:

      指定位掩码(阅读bit masks on Wikipedia):

      FLAG_1 = 1  # 0000 0001
      FLAG_2 = 2  # 0000 0010
      FLAG_3 = 4  # 0000 0100
      ...
      

      然后使用AND检查是否设置了一个位(flags包含你的字节):

      if(flags & FLAG_1) { # bit 0 is set, example: 0001 0101 & 0000 0001 = 0000 0001
      
      }
      if(flags & FLAG_2) { # bit 1 is set, example: 0001 0101 & 000 0010 = 0000 0000
      
      }
      ...
      

      当然,您应该根据上下文将FLAG_1, etc 命名为有意义的名称。例如。 ENABLE_BORDER.

      更新:
      我对您的评论感到困惑,哪些位已设置,但在阅读了另一个答案后,我意识到您正在计算错误端的位。位从右开始编号为零。

      【讨论】:

        【解决方案4】:

        函数是:

        def get_site_value(byteval, index):
          ''' Function to get local value at a given index''' 
          return (byteval >> index) &1
        

        【讨论】:

          猜你喜欢
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多