Comments 8
Как эффективно отделить четные биты от нечетных
X=B0 B1 B2 B3 B4 B5...B63 => Y=B0 B2 B4… B62, Z=B1 B3 B5...B63
и эффективно расставить биты в обратном порядке X=B0 B1… B63 => Y=B63...B1 B0 ?
Здесь будет интересно разобрать принцип представления в Go отрицательных чисел
Как здорово, что это только в Go.
Похоже, все эти "хитрости" - то, что штатно использовалось в си.
Рассмотрим пример:
0b1001 + 0b01001
. Здесь0b1 + 0b1 == 0b10
, и это компонента2*(a&b)
при том, что0b1000 + 0b01000 == 0b11000
выражается черезa^b
Написал автору оригинала, что тут ошибка. 0b1000 + 0b01000 == 0b11000
на самом деле равно 0b10_000
и в примере должно быть 0b01_000 + 0b10_000
И ещё вот это
0xdfff-0xd800=0x7fff
Должно быть 0xdfff-0xd800=0x7ff
а не 0x7fff
Думал не писать коммент, но в переводе есть одна неточность
В Go отсутствует операция сдвига вправо
Операция сдвига вправо в Go есть, а вот функции обратной bits.RotateLeft8
нет, то есть нет операции ротации вправо.
сдвиг влево на 3 бита – это то же самое, что сдвиг вправо на 5 бит
Вот это уже совершенно не верно в контексте сдвигов, но верно в контексте ротации битов в числе.
Для новичков такие ошибки приводят к тому, что статью вроде прочитал, но ничего не понял.
Эффективная работа с битами при помощи Go