Pull to refresh
1
Send message

Там походу все переписать надо руками.по тому что я прочитал из статьй етой так эта ОС просто картинка не чего не работает открывает картинку одну за другой какая разница как называется эта картинка-блокнот или терминал

Если все равно не чего не делает и хорошо что не делает было хуже если бы делала не предсказуемое

Не хочу обидить товарища автора этой статьй но какие там биты старшие младшие о которых говорит.

это простая арифметика.

Или он очень коротко обесняет или до конца не понял сам эту функцию.

Хотя это и к лутчему не до конца обяснять чтобы мы сами до думались

И по этому получается как будто умножения чуток больше чем 1/3

Потому что (2^33+1)/3>>33

= (2^33+1)/3/2^33

То что слева в скобках почти равно тому что с права и получается умножения почти на

Одну третию

А почему почти и почему эта однерка нужна потому что без однерки не делится на три

А почему плюс один а не минус потому что если минус будит меньше одной третий и не когда не будит правильно

А с плюс один всегда правильно потомучто остаточек настолько маленький что только если чесло которое хотим разделить оно больше в три раза чем сдвиг то будит не правильно.

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

n это чесло которое хотим разделить на 3

n*11>>5(тут сработает до чесел меньше 96)

n*43>>7(тут до 384)

И так можно игратся магическое чесло это всего лиш любая степень двойки которая делится ровно на три если добавить один поделите это чесло на 3 и получится магическое чесло после умножения любого чесла на него сдвинти вправо на ту степень двойки изначальную и будит это все равно на умножения на треть с маленьким остатком который тоже всегда треть разделеная на тот же сдвиг поскольку этот один который мы плюсовали и по делили на три он добавил нам одну третию

Например послединий мой пример

43 это (128+1)/3

128=2^7

А ровно 1/3 это 42.666.../128

Получаетсь всегда остаток маленький в

0.333333...../128

Приведем к целому

1/384

И так чесло которое привышает или равно 384

Уже результат будит не правильный.

И вот почему в этом магическом чеслу он выбрал такое огромное чесло 0xAAAAAAAB

Сдвиг от которого как раз превышает 4 байта то что int вмешяет и все числа которые хочеш разделить они же в данной функций не привышают int вот и будит правильно.

Заранее простите то что не совсем ясно обясняю

Сдвиг на 33 а не на 32 потому что магическое число 0xAAAAAAAB оно тупо НЕ 2^32/3

А (2^33+1)/3

Используйте калькулятор и увидите

Information

Rating
Does not participate
Registered
Activity