C # Так, как работает этот шестнадцатеричный материал? - PullRequest
0 голосов
/ 31 мая 2018

Я занимаюсь программированием начального уровня на codefights.com и натолкнулся на следующий вопрос.Ссылка на блог, в котором есть ответ, но он также включает в себя вопрос.Если бы только у него было объяснение ...

https://codefightssolver.wordpress.com/2016/10/19/swap-adjacent-bits/

Меня беспокоит строка кода (это строка кода only ) ниже.

return (((n & 0x2AAAAAAA) >> 1) | ((n & 0x15555555) << 1)) ;

В частности, я изо всех сил пытаюсь найти приличную информацию о том, как работают "0x2AAAAAAA" и "0x15555555", поэтому у меня есть несколько глупых вопросов.Я знаю, что они представляют двоичные значения 10101010 ... и 01010101 ... соответственно.

1.Я перепутал некоторые из них и обнаружил, что число 5 и А соответствует слабо и, насколько я могу судить, битовому размеру, но как?

2.Почему как?Почему 5с?

3.Почему 2 и 1 перед As и 5s?

4.Что-нибудь еще, что я должен знать об этом?Кто-нибудь знает интересный пост в блоге или веб-сайт, который объясняет это более подробно?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

0x2AAAAAAA используется для получения 30 битов, что является ограничением.

Ограничения: 0 ≤ n <2 ^ 30. </p>

0x15555555 также представляют 30 битов с битами, противоположными другому числу.Я хотел бы начать с двоичного числа (101010101010101010101010101010) в калькуляторе и выбрать гекс, используя калькулятор программиста, чтобы показать число в шестнадцатеричном формате.

Вы также можете использовать 0b101010101010101010101010101010, если хотите, в зависимости от языка.

0 голосов
/ 31 мая 2018

0x2AAAAAAA - это 00101010101010101010101010101010 в 32-разрядном двоичном файле,

0x15555555 - это 00010101010101010101010101010101‬ в 32-разрядном двоичном файле.

Обратите внимание, что проблема указывает Constraints: 0 ≤ n < 2^30.По этой причине старшие два бита могут быть 00.

Два шестнадцатеричных числа были «построены», начиная с их двоичного представления, которое обладает определенным свойством (которое мы увидим в следующем абзаце).

Теперь ... Мы можем сказать,что, учитывая ограничение, x & 0x2AAAAAAA вернет четные биты x (если мы посчитаем биты как первый, второй, третий ... второй бит четен), а x & 0x15555555 вернет нечетные битыx.Используя << 1 и >> 1, вы перемещаете их на один шаг.Используя | (или), вы объединяете их.

...