Самостоятельная работа. Операции с целыми числами




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 часа! Прекращайте, парни, начинайте уже трудиться. В учебниках все есть.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: