我有一个我的应用扫描的设备。扫描超过连续的十六进制值范围。我目前按如下方式遍历范围:
for (int i = 0; i < 0xFF00 - 0x0100; i++) {
SCAN_ADDRESSES[i] = i + 0x0100;
}
扫描需要很长时间,而且我发现大多数有趣的结果都是十六进制值,所以我想先扫描一下。在我的示例中,所需的集合将从该范围中最重要的圆形十六进制值开始。
{
0xE000, 0xD000, 0xC000, 0xB000, 0xA000, 0x9000, 0x8000, 0x7000, 0x6000, 0x5000, 0x4000, 0x3000, 0x2000, 0x1000,
0xFE00, 0xFD00, 0xFC00, 0xFB00, 0xFA00, 0xF900, 0xF800, 0xF700, 0xF600, 0xF500, 0xF400, 0xF300, 0xF200, 0xF100,
⋮
0x010F, 0x010E, 0x010C, 0x010B, 0x010A, 0x0109, 0x0108, 0x0107, 0x0106, 0x0105, 0x0104, 0x0103, 0x0102, 0x0101
}
所需范围包含n
0x0100 <= n < 0xFF00
我不在乎每个权力在递减或递增顺序中被迭代,只要权力本身是递减顺序。我也不想要任何重复。
我希望有一些简单的循环可以做到这一点。否则甚至可能会有一个递归功能,可以做我想要的。在此先感谢您的帮助和建议。如果有任何可能对我有帮助的话,我会使用番石榴。
答案 0 :(得分:0)
您可以在同一循环中反转迭代数字的十六进制表示。不确定这是否是您正在寻找的,因为订单不会严格上升或下降。然而,首先搜索“偶数”地址,并且没有重复。
int reversed = ((i&0x000F)<<12) + ((i&0x00F0)<<4)
+ ((i&0x0F00)>>4) + ((i&0xF000)>>12);