Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;用于检查整数是否包含给定十六进制模式的代码_C++_Hex - Fatal编程技术网

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

C++ c++;用于检查整数是否包含给定十六进制模式的代码,c++,hex,C++,Hex,我有一些整数(64位),我想检查它们是否包含一些十六进制模式 例如,假设整数是0x00000B21,我想检查它是否包含十六进制模式0x00000A20。如果我执行正常的(Num1&Num2)==Num2,这将检查Num1是否包含二进制模式Num2。(在我引用的示例中,这将返回true,即使数字不匹配,也是如此。) 检查十六进制模式的好方法是什么?我会使用位掩码(Num1&Num2)==Num2。我认为这是最好的方法。计算速度快且易于阅读。您必须首先使用以下内容计算“掩码” unsigned lo

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

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


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

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

您必须首先使用以下内容计算“掩码”

unsigned long long mask = 0;
while (mask < num2) mask = (mask << 4) | 0x0F;
if ( (num1 & mask) == num2 ) ...
无符号长掩码=0;

虽然(mask
(Num1 & Mask(Num2)) == Num2
其中,我们将掩码定义为:

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);
}
您将执行
(0x00000B21和0x00000FFF)==0x00000A20


基本上,当您计算掩码时,对于每个nybble,如果您对值感兴趣,请输入F,如果您不感兴趣,请输入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时,这也会起作用。

long number=。。。;
long number = ...;
long pattern = ...;
for(int i = 0; i < 64; i++)
{
    if( ( (number >> i) & pattern) == pattern)
    {
        // true
        break;
    }
}
// false
长模式=。。。; 对于(int i=0;i<64;i++) { 如果((数字>>i)和模式==模式) { //真的 打破 } } //假的
<>这是可行的。抱歉,如果这不是非常典型的(或可编译的)C++代码。我主要用java编写。
不管怎么说,这一点很清楚。

&&
是逻辑AND,
&
是位AND。你的问题毫无意义。你说的“包含模式”到底是什么意思?如果位模式以十六进制匹配,它也将以二进制匹配。@AusCBloke:谢谢你指出这一点。这是一个打字错误。@DanielPryden:对,但反过来不是。二进制匹配并不意味着十六进制匹配。例如,二进制模式
1011
包含二进制模式
0010
,但包含十六进制
0xB
不包含
0x2
,正如我在问题中所说,这将不起作用。它将更新问题以使其更清楚。它肯定不适用于逻辑AND,它将适用于按位AND。@nmjohn:它甚至不适用于按位AND。apoorv020给出的示例就是一个明确的例子:我看不到
0xA20
出现在
0xB21
我想我不知道真正的问题仍然是什么。0xA20=>1010 0010 0000,0xB21=>1011 0010 0000。这种模式0xA20实际上出现在0xB21中。也许如果我们能得到更多的案例(正面和负面)。这是有道理的。我相信他的意思是在Nyble-by-Nyble的基础上。但你是对的,它不是很清楚。如果0是目标模式中的必需数字,则不起作用。这是二进制比较,而不是十六进制比较。如果你看问题,这正是OP所说的不起作用(除了最初输入的
&
而不是
&
)@KenWayneVanderLinde:它怎么会不起作用?
num1&0xFFF
0xB21
0xB21==0xA20
是0/false。
num2&0xFFF
0xA20
0xA20==0xA20
是1/true。OP尝试了
(num&pattern)==pattern
(num&mask)相反==pattern
@kenwaynevanderinde:不用担心,你让我先猜猜我自己
long number = ...;
long pattern = ...;
for(int i = 0; i < 64; i++)
{
    if( ( (number >> i) & pattern) == pattern)
    {
        // true
        break;
    }
}
// false