用于检查整数是否包含给定十六进制模式的c++代码

c++ code to check if an integer contains a given hexadecimal pattern

本文关键字:模式 十六进制 c++ 代码 检查 整数 是否 包含 用于      更新时间:2023-10-16

我有一些整数(64位),我想检查它们是否包含一些十六进制模式。

例如,假设整数是0x00000B21,我想检查它是否包含十六进制模式0x00000A20。如果我执行正常的(Num1 & Num2) == Num2,这将检查Num1是否包含二进制模式Num2。(在我引用的例子中,这将返回true,即使十六进制数字不匹配。)

检查十六进制模式的好方法是什么?

您应该执行(0x00000B21 & 0x00000FFF) == 0x00000A20

基本上,当你计算掩码时,对于每个nybble,如果你对值感兴趣,就输入F,如果你不感兴趣,则输入0。

似乎有一种更优雅的方式,但这肯定会奏效:

(Num1 & Mask(Num2)) == Num2

我们将Mask定义为:

uint64 Mask(uint64 x) {
  return 
    ((x & 0xF0000000) ? 0xF0000000 : 0) |
    ((x & 0x0F000000) ? 0x0F000000 : 0) |
    ((x & 0x00F00000) ? 0x00F00000 : 0) |
    ((x & 0x000F0000) ? 0x000F0000 : 0) |
    ((x & 0x0000F000) ? 0x0000F000 : 0) |
    ((x & 0x00000F00) ? 0x00000F00 : 0) |
    ((x & 0x000000F0) ? 0x000000F0 : 0) |
    ((x & 0x0000000F) ? 0x0000000F : 0);
}

做你想要做的事情并避免你所说的问题的一个简单方法是简单地屏蔽掉你不想要的十六进制数字(你的模式的大小),然后将其与你的模式进行比较。即:

#include <iostream>
int main(void)
{
   unsigned num1 = 0x00000B21;
   unsigned num2 = 0xABC0A20;
   unsigned pattern = 0xA20;
   std::cout << ((num1 & 0xFFF) == pattern) << std::endl;
   std::cout << ((num2 & 0xFFF) == pattern) << std::endl;
   return 0;
}

输出:

0
1

当您希望0包含在模式中时,此也将起作用。

您必须首先用之类的东西计算"掩码"

unsigned long long mask = 0;
while (mask < num2) mask = (mask << 4) | 0x0F;
if ( (num1 & mask) == num2 ) ...

通过使用二分法,掩模计算可能会加快一点。

请注意,此检查将用于查找num2的十六进制数字是否在num1的末尾。这与((num1 & num2) == num2)在二进制中的作用不同。

我会使用位掩码(Num1&Num2)==Num2。我认为这是最好的方法。计算速度快,易于阅读。

long number = ...;
long pattern = ...;
for(int i = 0; i < 64; i++)
{
    if( ( (number >> i) & pattern) == pattern)
    {
        // true
        break;
    }
}
// false

这应该行得通。很抱歉,如果这不是典型的(或可编译的)C++代码。我主要用Java写作。不管怎么说,它能让人明白这一点。