【问题标题】:Create a byte bitmask using values from an array使用数组中的值创建字节位掩码
【发布时间】:2018-01-16 11:29:30
【问题描述】:

我必须在 C 中创建一个字节掩码。 我有一个数组,其中:

myArray[0] - 连续掩码第一位索引

myArray[1] - 连续掩码最后一位索引

连续掩码表示位与位。 Byte 中的其余位为零。

示例:myArray[0]=1 和 myArray[1]=2 所以我的字节掩码应该是:00000110

myArray 值可能不同,因此掩码不同。 我将在另一个字节上使用此掩码(使用和/或/xor 操作)来归档所需的结果。

能否请您提供创建这种掩码的简单 C 语言代码?

【问题讨论】:

  • 不管字节序如何,将 LSB 存储在字节 0 中是最有意义的。
  • 为什么这里需要有混乱的数组?只有 2 个变量:例如 msb_indexlsb_index
  • 我的任务的第一步是执行一些控制台程序,输出类似于这样的数据:=================== pattern: [ 3; 6;-3] 模式:[ 4; 6;-2] 模式:[ 2; 3; 6]图案:[2; 7; 4] =================== 然后我必须创建四个字节掩码。第一列包含 LSB,第二列包含 MSB。最后一列包含循环位移位的计数(左或右取决于符号 pos/neg)。我决定过滤掉这些值并将它们输入一个数组以供将来操作。

标签: c arrays byte bitmask


【解决方案1】:
((1 << (myArray[1] -myArray[0] +1)) -1) << myArray[0]

【讨论】:

    【解决方案2】:

    一个想法是首先使用第二个数字将所有位设置到该点,然后使用第一个数字清除下面的位。

    unsigned char mask = ((1 << (myArray[1] + 1)) - 1) & ~((1 << myArray[0]) - 1)
    

    使用您示例中的值,((1 &lt;&lt; (myArray[1] + 1)) - 1) 将是((1 &lt;&lt; (2 + 1)) - 1),即00000111。后半部分计算为~((1 &lt;&lt; 1) - 1),即11111110。因此,最终结果是00000111 &amp; 11111110,即00000110

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多