XOR
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.08.09 14:17
Оценка:
Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.
Re: XOR
От: Andir Россия
Дата: 27.08.09 14:44
Оценка:
Здравствуйте, nikov, Вы писали:

N>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


XOR для всех чисел от 1 до 2^N — 2 = 0 — доказывается элементарно (достаточно посмотреть на пары чисел 2^N — 2 и 1, 2^N — 3 и 2, 2^N — 4 и 3, и т.д.)
То есть, нужно найти ближайшую степень двойки и сделать XOR от 2 ^ X — 2 до N, где X целая часть от log2 N.

С Уважением, Andir!
Re: XOR
От: makes Россия  
Дата: 27.08.09 14:45
Оценка: 1 (1) +1
Здравствуйте, nikov, Вы писали:

N>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


не совсем понятно, как "4-битное беззнаковое целое" может быть "настолько велико..."
разве оно не лежит в пределе [0,15]?
Re: XOR
От: Eugene Sh Россия  
Дата: 27.08.09 14:51
Оценка:
Здравствуйте, nikov, Вы писали:

N>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


4-битное или 4-байтное? Ну, да не суть важно.

Обозначим искомую функцию как F(N).

Утверждение 1.
F(4*K — 1) = 0 для любого целого K >= 1.

Доказательство.
По индукции.
1. Для K=1,2 можно проверить вручную.
2. Пусть верно для K. Перейдем к K+1.
F(4*(K+1) — 1) = 0 XOR 1 XOR 2 ... XOR (4*K-1) XOR (4*k) XOR (4*K+1) XOR (4*K+2) XOR (4*K+3) = F(4*K — 1) XOR (4*k) XOR (4*K+1) XOR (4*K+2) XOR (4*K+3) = 0 XOR (4*k) XOR (4*K+1) XOR (4*K+2) XOR (4*K+3) = (4*k) XOR (4*K+1) XOR (4*K+2) XOR (4*K+3)

Теперь посмотрим, что такое (4*k) XOR (4*K+1) XOR (4*K+2) XOR (4*K+3).
4*K в двоичной записи имеет вид [что-то]00,
4*K+1 в двоичной записи имеет вид [что-то]01,
4*K+2 в двоичной записи имеет вид [что-то]10,
4*K+3 в двоичной записи имеет вид [что-то]11,

Это [что-то] — последовательность из 0 и 1, одинаковая для всех 4 чисел.
Отсюда видно, что (4*k) XOR (4*K+1) XOR (4*K+2) XOR (4*K+3) = 0.
Доказано.


А теперь уже легко понять, как посчитать F(N) для любого N. Для этого надо сделать не больше 3-х операций XOR.
Re[2]: XOR
От: Andir Россия
Дата: 27.08.09 14:55
Оценка:
Здравствуйте, Andir, Вы писали:

A>XOR для всех чисел от 1 до 2^N — 1 = 0 — доказывается элементарно (достаточно посмотреть на пары чисел 2^N — 2 и 1, 2^N — 3 и 2, 2^N — 4 и 3, и т.д.)


Маленькая ошибка закралась:
То есть, XOR всех чисел от 1 до 2^N — 2 даёт число со всеми единицами в разрядах == 2 ^ N — 1 и XOR на это число даёт 0.

С Уважением, Andir!
Re: XOR
От: Ovl Россия  
Дата: 27.08.09 14:57
Оценка:
Здравствуйте, nikov, Вы писали:

N>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


1,5,9,.... : XOR = 1
2,6,10,... : XOR = N+1
4,8,12,... : XOR = N
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: XOR
От: Eugene Sh Россия  
Дата: 27.08.09 15:07
Оценка:
Здравствуйте, Eugene Sh, Вы писали:

ES>А теперь уже легко понять, как посчитать F(N) для любого N. Для этого надо сделать не больше 3-х операций XOR.

Даже можно так:
F(N) = N,   если N=4*k
F(N) = 1,   если N=4*k+1
F(N) = N+1, если N=4*k+2
F(N) = 0,   если N=4*k+3
Re: XOR
От: vadimcher  
Дата: 27.08.09 15:09
Оценка:
Здравствуйте, nikov, Вы писали:

N>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


1) Если число при делении на 4 дает в остатке 1 или 2, то в младшем разряде будет 1, иначе 0.
2) XOR чисел от 0 до 2^k-1 будет, очевидно, 0, т.к. перебираются все комбинации соответствующих 0 и 1 (на каждом месте ровно половину раз встретится 1).
3) Смотрим на старшую единицу, она на k-м месте, значит xor всех до нее даст ровно 2^k. Потом она будет участвовать в каждом следующем числе, т.е. если N нечетное, то в этом разряде будет 0, а если четное -- 1. Для младших разрядов после числа 2^k все начинается, как бы, с чистого листа, потому как 1 xor 2 xor ... xor 2^k = 2^k = 100000...0. Значит там применяем аналогичную логику.

В итоге:
— если число нечетное, то мы получим либо 0, либо 1, в зависимости от того, какой остаток при делении на 4, а именно, если в двух младших разрядах стоит x1, то результат будет x xor 1.
— если число четное, то оно, согласно тому, что выше, сохранится полностью, но в младшем разряде иногда может вместо нуля появиться 1, когда остаток от деления на 4 равен 2, т.е. когда в младших двух разрядах стоят 10.
unsigned __int64 xorall(unsigned __int64 n) {
    return n & 1 ? ((n >> 1) & 1) ^ 1 : n + ((n >> 1) & 1);
}

А вот зайца кому, зайца-выбегайца?!
Re: XOR
От: ДимДимыч Украина http://klug.org.ua
Дата: 27.08.09 15:41
Оценка:
Здравствуйте, nikov, Вы писали:

N>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


Оно?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: XOR
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.08.09 16:16
Оценка:
Здравствуйте, makes, Вы писали:

N>>Дано 4-битное беззнаковое целое число N. Надо найти XOR всех чисел от 0 до N включительно. Число N может быть настолько велико, что N итераций цикла делать слишком долго.


M>не совсем понятно, как "4-битное беззнаковое целое" может быть "настолько велико..."

M>разве оно не лежит в пределе [0,15]?

Шестерка не пропечаталась. Имелось в виду 64-битное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.