1. Напишите логическую операцию и маску (в шестнадцатеричной системе счисления), которые нужно применить, чтобы ОБНУЛИТЬ указанные биты 16-битного целого числа (биты нумеруются справа налево, начиная с 0).
2. Напишите логическую операцию и маску (в шестнадцатеричной системе счисления), которые нужно применить, чтобы УСТАНОВИТЬ указанные биты 16-битного целого числа.
3. Выполните логическую операцию «исключающее ИЛИ» между заданными числами и запишите в ответе полученное число в шестнадцатеричной системе счисления.
4. Число записано в указанных битах 16-битного целого числа, хранящегося в переменной N. Какие операции нужно выполнить, чтобы записать это число в переменную X? Маски для выполнения логических операций записывайте в шестнадцатеричной системе счисления.
Входные данные: (пример)
Вариант 21
1. {2, 9, 6}
2. {3, 4, 0}
3. 0x2E xor 0xC5
4. биты с 13 по 15
Давайте подробно разберем, как решаются такие задачи:
Решения:
1. У нас есть какое-то число, которое занимает 16 бит. Нумеруются биты с «0». Поэтому нужно внимательно читать условие. Если говорится о позиции бита, то мы отсчитываем эту позицию справа налево, а если, как в нашей задаче, речь идет о «указанных битах», то мы просто выбираем биты с данными номерами.
Номера битов
х | х | х | х | х | х | х | х | х | х | х | х | х | х | х | х |
Само содержимое битов
У нас задача обнулить 2, 9 и 6 биты. Чтобы гарантированно получить ноль в этих позициях мы должны применить логическую операцию «И» с каким-то числом (это та самая маска), чтобы на выходе получилось число, отличающееся от первого только «0» в соответствующих битах.
|
х | х | х | х | х | х | х | х | х | х | х | х | х | х | х | х |
Маска должна содержать «0» в 2, 6 и 9 битах, а все остальные значения вроде бы не важны. Но правильно применять так называемую строгую маску. Нам нужен гарантированно точный результат: что только в этих позициях будут производиться изменения. Поэтому маска будет представлять из себя число, где все биты будут равны «1», кроме 2,6 и 9. Там в маске должен стоять «0». И тогда, какое бы значение не пришло в этот бит регистра – на выходе мы всегда получим то, что хотели: «0»!
х | х | х | х | х | х | х | х | х | х | х | х | х | х | х | х |
Дальше мы должны маску записать в 16-ном коде. Делается это элементарно: справа налево группируем по 4 бита и каждую такую группу переводим в 2-ную систему счисления. Если кому трудно это делать, то в винде есть программа «калькулятор», который в режиме «программист» осуществляет это легко и без ошибок. (На СР пользоваться им будет низзя.)
0 |
15 13 11 11
F D B B
Осталось сформулировать ответ: Операция «И» с маской FDBB
2. Второй вопрос разбирать я не вижу смысла. Там то же самое, только требование «установить 1» в какие-либо биты нужно понимать, как: операция «ИЛИ» с маской, где в заданных номерах битов будут «1» (Это 0, 3 и 4 в задании), а остальные заполняем «0».
|
3. Здесь требуется осуществить операцию «Исключающее ИЛИ» для двух заданных чисел. На что обратить внимание? 0х2Е – это один из видов записи числа в 16-ричной СС. Эти буковки говорят нам о том, что в самых младших 4-х разрядах регистра будет содержаться число Е (1110), в битах № 4-8 – число 2 (0010), а все, что осталось (старшие биты) – заполняем «0».
Со вторым числом поступаем также, т.е. записываем и его в 2-ной СС в 16 битах. И выполняем операцию «xor». Второе число выступает здесь в роли маски. Операция «исключающее или» работает просто и красиво: там, где в маске «0» значения битов первого числа не меняются, а где в маске стоит «1», биты первого числа инвертируются.
14 11
Е В
Ответ: ЕВ
4. Ну, последнее задание в этой работе касается логического сдвига. Дано какое-то число, размер его 16 бит (переменная N). И в этом коде часть кода – тоже число, которое мы с вами должны выделить и записать в переменную Х. Нам указаны номера битов (13-15). Что мы делаем?
х | х | х | n | n | n | n | n | n | n | n | n | n | n | n | n |
Будем использовать операцию «И» и маску такую, чтобы установить «0» везде, кроме указанных битов. Эта маска 0хЕ000: 1110 0000 0000 0000. Обратите внимание на то, что в записи 0хЕ000 старших битов, заполненных «0», нет. Все 16 разрядов заняты. Начинаем писать число всегда с младших разрядов! В таком случае 0хЕ000 просто указывает на то, что число 16-ричное.
|
Далее, мы сдвигаем число так, чтобы первая значимая единица установилась в младшем бите. Избавляемся от ненужных нулей (прочитайте про выравнивание порядков и сдвиги – и просветление вам гарантированно).
У нас 13 нулей, - сдвиг вправо на 13 позиций!
х | х | х | n | n | n | n | n | n | n | n | n | n | n | n | n |
х | х | х |
Это результат операции И
Сдвиг
х | х | х | |||||||||||||
х | х | х |
Записывается это так: (N and 0xE000) shr 13
Можем сначала сделать сдвиг на 13 позиций а затем операцию «И» с маской, где будут все«1».
(N shr 13) and 0xFFFF
Ну вот и вся работа. Решить ее занимает времени – минут 15-20, а написать вам это все, «разжевать и в рот положить» заняло у меня 2 часа! Прекращайте, парни, начинайте уже трудиться. В учебниках все есть.