Приветствую CodeForces' Users!
Мне как-то такой вопрос задали:
Можно ли за O(1) сделать реверс битов, без precalc'а?
Я ничего лучше O(n) не придумал, где n - кол-во бит.
При этом мне сказали что можно за O(1), но таки не сказали как.
Например: 101001 -(преобразование)- 100101.
UPD:
Блин Гуглом надо было попользоваться(
нашел ответ :
unsigned rev (unsigned x) { x = (x & 0x55555555) << 1 | (x >> 1) & 0x55555555; x = (x & 0x33333333) << 2 | (x >> 2) & 0x33333333; x = (x & 0x0F0F0F0F) << 4 | (x >> 4) & 0x0F0F0F0F; x = (x <<24) | ((x & 0xFF00) <<8) | ((x >> 8) & 0xFF00) | (x >> 24); return x; } Прошу прощение. |
UPD. А вообще тут не совсем корректно применение O(). O(n) для 32- или 64- битных чисел - это O(1). Для массива длиной n быстрее чем за O(n) имхо никак. Чисел произвольной битности я как то не встречал...
Ко всем вышеотписавшимся - некорректность я имел в таком ключе: автор топика не говорит какая длина чисел подразумевается (да и вообще на какой машине это все выполняется). O(1) - конкретно для 32-х или 64-х битных чисел (причем что то одно из них! и машина умеет оперировать сразу со всеми битами (upd: хотя тут это даже не важно)). Если машина умеет за O(1) выполнять простейшие действия с числами длины N (N не константа), то решение за O(logN). Для обычных же машин (которые не умеют параллельно менять все N битов числа) - быстрее O(N) никак (ибо мы в худшем случае меняем все биты).