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