ИКТ. Раздел 1 Понятие информации
Скачать 57.12 Kb.
|
Раздел 3 Обработка беззнаковых целых чисел Для контроля выхода суммы за разрядную сетку в микропроцессорах используется флаг переноса. Флаг переноса CF (Carry flag) – битовый флаг, который устанавливается (= 1), если в результате арифметической операции произошёл перенос из старшего разряда, иначе – сбрасывается (= 0). При выполнении операции арифметического сложения флаг CF можно рассматривать как дополнительный разряд результата. Задача 1 Найдите однобайтовый двоичный код для чисел. Разрешается использовать калькулятор Windows. а) 11 б) 128 в) 19 Решение: а) Переведем 1110 в двоичную систему вот так: Целая часть числа находится делением на основание новой
Получилось:1110 = 10112 б) Переведем 12810 в двоичную систему вот так: Целая часть числа находится делением на основание новой
Получилось:12810 = 100000002 Результат перевода: 12810 = 100000002 в) Переведем 1910 в двоичную систему вот так: Целая часть числа находится делением на основание новой
Получилось:1910 = 100112 Задача 2 Найдите десятичное число по его двоичному коду. Разрешается использовать калькулятор Windows. а) 11001011 б) 10000001 в) 11111111 г) 1000000000000000 д) 1000000000000001 е) 1111111111111111 Решение: а) 110010112 = 1∙27+1∙26+0∙25+0∙24+1∙23+0∙22+1∙21+1∙20 = 128+64+0+0+8+0+2+1 = 20310 б) 100000012 = 1∙27+0∙26+0∙25+0∙24+0∙23+0∙22+0∙21+1∙20 = 128+0+0+0+0+0+0+1 = 12910 в) 111111112 = 1∙27+1∙26+1∙25+1∙24+1∙23+1∙22+1∙21+1∙20 = 128+64+32+16+8+4+2+1 = 25510 г) 10000000000000002 = 1∙215+0∙214+0∙213+0∙212+0∙211+0∙210+0∙29+ 0∙28+0∙27+0∙26+0∙25+0∙24+0∙23+0∙22+0∙21+0∙20 = 32768+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0 = 3276810 д) 10000000000000012 = 1∙215+ 0∙214+0∙213+0∙212+ 0∙211+0∙210+0∙29+0∙28+0∙27+0∙26+0∙25+0∙24+0∙23+0∙22+0∙21+1∙20 = 32768+0+0+0+0+0+0+0+0+0+0+0+0+0+0+1 = 3276910 е) 11111111111111112 = 1∙215+1∙214+1∙213+1∙212+1∙211+1∙210+1∙29+ 1∙28+1∙27+1∙26+1∙25+1∙24+1∙23+1∙22+1∙21+1∙20 = 32768+16384+8192+4096+2048+1024+512+256+128+64+32+16+8+4+2+1 = 6553510 Задача 3 В каких случаях сложение чисел x и y переполнит разрядную сетку и в переменной z будет получен неправильный результат: а)byte x = 0b10000000; byte y = 0b01111111; byte z = (byte)(x + y); б)byte x = 0b10000001; byte y = 0b01111111; byte z = (byte)(x + y); в)byte x = 0b10000001; byte y = 0b01111111; uint z = (uint)(x + y); г)byte x = 0x0F; byte y = 0xF0; byte z = (byte)(x + y); д)byte x = 0x99; byte y = 0x99; byte z = (byte)(x + y); е) byte x = 0x7F; byte y = 0x81; byte z = (byte)(x + y); ж)ushort x = 0xFFFE; ushort y = 0b1; ushort z = (ushort)(x + y); з)ushort x = 0xF0F0; ushort y = 0x0F0F; ushort z = (ushort)(x + y); и) ushort x = 0xFFFF; ushort z = (ushort)(x++); к) ushort x = 0xFFFF; uint z = (uint)(x++); Ответ: б,д,е,и Задача 7 Найти значение флага CF при выполнении операций над 4- разрядными беззнаковыми числами. Результат операции записать в десятичном виде. а) 0101+1101 б) 1101+1000 в) 0111+1111 г) 1111+1110 Решение: а) 1012+ 11012)= 100102 100102 = 1∙24+0∙23+0∙22+1∙21+0∙20 = 16+0+0+2+0 = 1810 б) 11012+ 10002= 101012 101012 = 1∙24+0∙23+1∙22+0∙21+1∙20 = 16+0+4+0+1 = 2110 в) 1112+ 11112= 101102 101102 = 1∙24+0∙23+1∙22+1∙21+0∙20 = 16+0+4+2+0 = 2210 г) 11112+ 11102= 111012 111012 = 1∙24+1∙23+1∙22+0∙21+1∙20 = 16+8+4+0+1 = 2910 Раздел 4 Битовая обработка данных Арифметические операции над битовыми последовательностями числа. Пусть задан байт x=01101010. Требуется найти сумму и произведение его старшей и младшей тетрад. Для этого надо выделить тетрады в отдельные переменные, которые потом арифметически сложить и умножить. byte x = 0b01101010; byte y = (byte)(x >> 4); x = (byte)(x & 0b00001111); // x & 0x0F Console.WriteLine("x = " + x); // 10 Console.WriteLine("y = " + y); // 6 byte s = (byte)(x + y); byte p = (byte)(x * y); Console.WriteLine("s = " + s); // 16 Console.WriteLine("p = " + p); // 60 При этом надо помнить, что сумма и произведение могут не поместиться в тетраду. В данном примере это не страшно, так как такого типа данных как тетрада у нас нет. Однако если бы мы складывали или перемножали байты, то результат пришлось бы записывать в двухбайтовые переменные. Задача 1 Разработать программу побитного выведения беззнакового байта на экран. Использовать умножение на маску и сдвиги. Решение: public class Program { public static void Main() { byte a = 5; for (int i = 7; i >= 0; i--) { Console.Write((a >> i) & 1); } Задача 5 Написать программу проверки того, что 2-байтовая переменная содержит одинаковые байты. Решение: publicclassProgram { public static void Main() { ushort num = ushort.Parse(Console.ReadLine()); int first_byte = (num & 0x00FF) >> 0; int second_byte = (num & 0xFF00) >> 8; Задача 7 Разработать программу для решения задачи, описанной в п.8 лекции. Решение: public class Program{ public static void Main() { string input = Console.ReadLine(); byte a = 0; for (int i = 0; i < 8; i++) { a = Convert.ToByte(a | (byte.Parse(input[i].ToString()) << (7 - i))); } Задача 9 Самостоятельно закодировать информацию о дате (год.месяц.день) в разрядах 4-байтовой переменной. Проверить то, что год, месяц и день не выходят за свой диапазон (год: 1-2100, месяц: 1-12 и день: 1-31) и вывести дату на экран в десятичном виде в формате: гггг:мм:дд. Решение: public class Program{ public static uint CheckInterval(uint value, uint min, uint max){ // ограничить число диапазоном return (value < min) ? min : (value > max) ? max : value; } public static void Main() { Console.Write("Год:"); |