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