2016-12-08 1 views
0

У меня есть устройство, которое сканирует приложение. Сканирование выполняется по последовательному шестнадцатеричному значению. Я в настоящее время цикл по диапазонам следующим образом:Как перебрать диапазон в порядке уменьшения шестнадцатеричной мощности

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 
} 

Требуемый диапазон содержит все числа, где n0x0100 <= n < 0xFF00

мне все равно, каждый мощность повторяется в декременте или приращении порядка, до тех пор, как полномочия самого декремент порядка. Я тоже не хочу дубликатов.

Я ожидаю, что будет какая-то простая петля, которая сделает это. В противном случае может быть даже рекурсивная функция, которая будет делать то, что я хочу. Заранее благодарим за помощь и предложения. Я использую guava, если что-нибудь в этом может помочь мне.

+0

Вы можете сгенерировать эти индексы с двумя вложенными циклами, один для ранга, ака «количество нулей в наименее значимых позициях», а другой для самых значащих цифр. –

ответ

0

Вы можете просто перевернуть шестнадцатеричное представление итерированных чисел в пределах одного и того же цикла. Не уверен, что это то, что вы ищете, потому что порядок не будет строго восходящим или нисходящим. Однако сначала проверяются «четные» адреса, и дубликатов нет.

int reversed = ((i&0x000F)<<12) + ((i&0x00F0)<<4) 
       + ((i&0x0F00)>>4) + ((i&0xF000)>>12);