用于检查整数是否包含给定十六进制模式的c++代码
c++ code to check if an integer contains a given hexadecimal pattern
我有一些整数(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写作。不管怎么说,它能让人明白这一点。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 绝对编码器十六进制输入
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 通过sscan f编写十六进制模式
- 以二进制模式扫描文件,并将十六进制字符解释为C++中的实际数字
- 用于检查整数是否包含给定十六进制模式的c++代码
- cpp中十六进制模式的大小