Top.Mail.Ru
? ?
Ни о какой безапелляционности в моих высказываниях не может быть и речи! [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

еще раз о битах [янв. 14, 2008|12:44 am]
Anatoly Vorobey
Вот еще одна задачка для программистов. Если знаете ответ, не пишите. Комментарии скрывать не буду; советую попробовать решить самостоятельно, до того, как подсматривать чужие ответы - красивая штука.

Дано 64-битное число x. Мы делаем с ним следующее (в псевдокоде):

accum = 0
do 64 times:
  accum += x
  x = x rot 1
end


Здесь rot - вращение числа на один разряд влево (выходящий слева бит становится вправо). И accum, и x - 64-битные числа без знака; при сложении мы отбрасываем бит переноса, если он образуется.

Вопросы: 1) что мы получаем? 2) почему это так получается?
СсылкаОтветить

Comments:
Страница 1 из 2
<<[1] [2] >>
[User Picture]From: insie_ru
2008-01-13 10:52 pm
почувствовал себя кретином
(Ответить) (Thread)
[User Picture]From: avva
2008-01-13 11:00 pm
Это полезное чувство. Случается со мной не реже раза в неделю, и обычно помогает :)
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: dimrub
2008-01-13 11:04 pm
1) -x
2) надо подумать
(Ответить) (Thread)
[User Picture]From: dimrub
2008-01-13 11:06 pm
Впрочем, нет, вру: результат ведь зависит только от числа зажженых битов в x, а не от его значения.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: kouzdra
2008-01-13 11:25 pm
Это x * (sum i=0..63 2^i) по модулю 2^64
соотвественно - (2^64-1)*x = -x

(если ничего не наврал +/-1 - пошел смотреть ответы)
(Ответить) (Thread)
[User Picture]From: kouzdra
2008-01-13 11:26 pm
PS: Похоже не наврал - по крайней мере с dimrub сошлось
(Ответить) (Parent) (Thread) (Развернуть)
From: ext_77409
2008-01-13 11:29 pm
Пусть в числе n-единиц.
Мы складываем само с собой 64 раза число сдвигаемое на 1 бит влево.
Если мы представим это сложением в столбик, то получим такой себе квадрат 64x64.
В каждой строке это число сдвигаемое на бит, но и в каждом столбце оно же!
Следовательно в каждом столбце n-единиц!
Поменяем единицы местами, так, чтобы в каждом столбце они шли подряд.
Так мы получаем n*0xFFFFFFFFFFFFFFFF = -n!
Спасибо за задачку!

Черт! Пока постил опередили...
(Ответить) (Thread)
[User Picture]From: avva
2008-01-13 11:30 pm
Ничего страшного, это не забег :) все верно, да. Красиво, правда?
(Ответить) (Parent) (Thread) (Развернуть)
(Удалённый комментарий)
[User Picture]From: spamsink
2008-01-13 11:38 pm
Красиво. Особенно когда через 10 минут размышлений понимаешь, что это издевательство, и что ответы на 1) и 2) - это одно и то же. :)
(Ответить) (Thread)
[User Picture]From: a_konst
2008-01-13 11:49 pm
а у меня сперва получилось просто 0xff..f * (чётность количества битов в x), со сложением многих экземпляров
0xff..f напутал.

Красиво, да.
Интересно, это самый эффективный способ посчитать это самое количество? Если пользоваться только базовыми инструкциями процессора.

Хотя, наверно если умело использовать флаг переполнения и условные переходы, то можно быстрее.
(Ответить) (Thread)
[User Picture]From: avva
2008-01-13 11:50 pm
Нет, есть два разных способа посчитать быстрее :) oдин ненамного быстрее, и еще один намного.
(Ответить) (Parent) (Thread) (Развернуть)
(Удалённый комментарий)
From: qaraabayna
2008-01-14 12:22 am
Эта задачка мне нравится больше.
(Ответить) (Thread)
From: dizzy57
2008-01-14 12:27 am
При обдумывании почти одновременно «выстрелили» две аналогии — симметризация тензора и преобразование Барроуза-Вилера. Вторая оказалась решающей, получилась конструкция как у failhigh.
(Ответить) (Thread)
From: drw
2008-01-14 01:07 am
Отрицание числа единиц в x.
(Ответить) (Thread)
From: drw
2008-01-14 01:09 am
Т.е. отрицание в смысле дополнения до двух, а не побитовое.
(Ответить) (Parent) (Thread) (Развернуть)
(Удалённый комментарий)
[User Picture]From: avva
2008-01-14 01:39 pm
Не, неверно.
(Ответить) (Parent) (Thread)
(Удалённый комментарий)
(Удалённый комментарий)
From: ex_tws5249
2008-01-14 04:56 pm
получается минус количество единиц в x

только зачем это, разве быстрее никак нельзя?
(Ответить) (Thread)
From: qaraabayna
2008-01-14 05:30 pm

кольцевые числа

только сейчас пришло в голову, что мое представление об int как о множестве-кольце можно поменять на представление о int как множестве из кольцевых представлений.
(Ответить) (Thread)
(Удалённый комментарий)
[User Picture]From: avva
2008-01-14 08:29 pm
Ага.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2008-01-16 01:34 am
Никак не могу понять, откуда берутся отрицательные числа, если по условиям задачи, все опранды без знака?
(Ответить) (Thread)
[User Picture]From: avva
2008-01-16 03:54 am
Можно объяснить так: в конце концов мы получаем число n * (2^64-1), где второй множитель равен 0x1111111111111111. Если его, этот множитель, интерпретировать как число со знаком, то это -1, и тогда результат можно интерпретировать как -n. Если продолжать к нему относиться как к числу без знака, то это просто какое-то неинтересное умножение.

Умножение на отрицательное число и на положительное без знака, ровно с теми же битами - один и тот же результат дает.
(Ответить) (Parent) (Thread)
[User Picture]From: barzel
2008-01-18 08:02 am
Можно задать вопрос вне темы?
Я тут решил разобраться с логарифмической линейкой. Вооружившись знанием того, что это очень "просто" я приступил к изучению и сразу споткнулся:
Есть способ получить корент из больших чисел(например порядка миллиона), есть даже описание, но описание какое-то не полное. В общем я не понял как оно работает, моет у Вас есть идея?
http://www.sliderule.ca/k12-prep-p14-15.jpg

Буду очень благодарен
(Ответить) (Thread)
Страница 1 из 2
<<[1] [2] >>