Math 将数字限制在基于掩码和比较寄存器的范围内

Math 将数字限制在基于掩码和比较寄存器的范围内,math,binary,embedded,bit-manipulation,Math,Binary,Embedded,Bit Manipulation,最近,我在一个嵌入式软件项目中偶然发现了以下问题。我还不知道在什么条件下会有一个独特的解决方案,以及如何找到它 让我们假设我们有一个16位掩码和一个16位比较值,并且我们想要设置它们,以便对于连续ID{a,…,b}(例如,{0x78,0x79,…,0x97})的定义范围,这些ID满足按位的要求 ID&MASK==比较 而超出该范围的ID不满足上述等式 例如:如果a=0x100,b=0x1FF,则掩码设置为0x700,比较设置为0x100 我有以下问题: 最小ID和最大ID存在唯一定义的掩码和比较

最近,我在一个嵌入式软件项目中偶然发现了以下问题。我还不知道在什么条件下会有一个独特的解决方案,以及如何找到它

让我们假设我们有一个16位掩码和一个16位比较值,并且我们想要设置它们,以便对于连续ID{a,…,b}(例如,{0x78,0x79,…,0x97})的定义范围,这些ID满足按位的要求

ID&MASK==比较

而超出该范围的ID不满足上述等式

例如:如果a=0x100,b=0x1FF,则掩码设置为0x700,比较设置为0x100

我有以下问题:

  • 最小ID和最大ID存在唯一定义的掩码和比较值的条件是什么
  • 如何计算呢

  • 期待您的回答

    掩码和比较的组合可以描述为一个字符串
    0
    1
    ,带有通配符(
    *
    )以指示“不在乎”位置。如果
    0
    1
    的左边有一个
    *
    ,则该字符串不描述连续范围。因此,表示范围的字符串正好是所有
    *
    位于右端的字符串。然后,可以通过这种方式检查
    a
    b
    的组合,我们可以将16位分为左部分和右部分,这样
    a
    b
    在左部分相等,
    a
    的右部分都为零,而
    b
    的右部分都为零。我们可以通过以下方式进行测试:

    ((((a ^ b) + 1) | a) & b) == a
    

    MASK
    COMPARE
    的组合可以描述为一个字符串
    0
    1
    ,带有通配符(
    *
    )以指示“不在乎”位置。如果
    0
    1
    的左边有一个
    *
    ,则该字符串不描述连续范围。因此,表示范围的字符串正好是所有
    *
    位于右端的字符串。然后,可以通过这种方式检查
    a
    b
    的组合,我们可以将16位分为左部分和右部分,这样
    a
    b
    在左部分相等,
    a
    的右部分都为零,而
    b
    的右部分都为零。我们可以通过以下方式进行测试:

    ((((a ^ b) + 1) | a) & b) == a
    
    你的意思是最小和最大ID的条件是什么,你的意思是最小和最大ID的条件是什么。