我有一些整数(64位)我想检查包含一些十六进制模式。
例如,假设整数是0x00000B21,我想检查它是否包含十六进制模式0x00000A20。如果我执行正常(Num1 & Num2) == Num2
,则会检查Num1
是否包含二进制模式Num2
。 (在我引用的例子中,这将返回true,即使十六进制数字不匹配。)
检查十六进制模式的好方法是什么?
答案 0 :(得分:9)
你做(0x00000B21 & 0x00000FFF) == 0x00000A20
。
基本上,当你计算面具时,对于每个nybble,如果你对这个值感兴趣,请输入F,如果你不感兴趣,则输入0。
答案 1 :(得分:2)
似乎可能会有更优雅的方式,但这肯定有用:
(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);
}
答案 2 :(得分:2)
一个简单的方法来做你想要的并避免你所说的问题就是简单地掩盖你不想要的十六进制数字(模式的大小),然后将它与你的模式进行比较。即:
#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包含在模式中,将也可以使用。
答案 3 :(得分:1)
你首先用
之类的东西来计算“掩码”unsigned long long mask = 0;
while (mask < num2) mask = (mask << 4) | 0x0F;
if ( (num1 & mask) == num2 ) ...
使用二分法可以加快掩码计算速度。
请注意,此检查将关于查找num2
的十六进制数字<{1}}的结尾 。这与num1
在二进制文件中的作用不同。
答案 4 :(得分:0)
我会使用按位掩码(Num1&amp; Num2)== Num2。我认为这是做到这一点的首选方式。计算速度快,易读。
答案 5 :(得分:0)
long number = ...;
long pattern = ...;
for(int i = 0; i < 64; i++)
{
if( ( (number >> i) & pattern) == pattern)
{
// true
break;
}
}
// false
这应该有效。对不起,如果这不是一个非常典型(或可编译)的C ++代码。我主要用Java编写。 无论如何,它得到了重点。