Программирование на языке Pascal — тест 2
Главная / Программирование / Программирование на языке Pascal / Тест 2
Упражнение 1:
Номер 1
Тип данных real
является
Ответ:
 (1) арифметическим 
 (2) базовым 
 (3) конструируемым 
 (4) порядковым  
 (5) структурированным  
Номер 2
Тип данных integer
является
Ответ:
 (1) арифметическим 
 (2) базовым 
 (3) конструируемым 
 
 (5) структурированным  
Номер 3
Тип данных boolean
является
Ответ:
 (1) арифметическим 
 (2) базовым 
 (3) конструируемым 
 (4) структурированным  
Упражнение 2:
Номер 1
Типы данныхbyte
иshortint
являются:
Ответ:
 (1) эквивалентными 
 (2) совместимыми 
 (3) совместимыми по присваиванию 
Номер 2
Типы данныхdouble
иreal
являются:
Ответ:
 (1) эквивалентными 
 (2) совместимыми 
 (3) совместимыми по присваиванию 
Номер 3
Типы данныхreal
иinteger
являются:
Ответ:
 (1) эквивалентными 
 (2) несовместимыми 
 (3) совместимыми по присваиванию 
Упражнение 3:
Номер 1
Какой тип будет иметь результат выражения a+b при a:word, b:integer?
Ответ:
 
 (2) word 
 (3) shortint 
 (4) integer 
 (5) longint 
Номер 2
Какой тип будет иметь результат выраженияa+b
приa:byte
,b:shortint
?
Ответ:
 (1) byte 
 (2) word 
 (3) shortint 
 (4) integer 
 (5) longint 
Номер 3
Какой тип будет иметь результат выражения a+b при a:shortint, b:word?
Ответ:
 (1) byte 
 (2)
word  (3) shortint 
 (4) integer 
 (5) longint 
Упражнение 4:
Номер 1
Какие из вариантов расстановки скобок в выражении a and b shr c mod a + c * a shl - b div a не меняют порядок выполнения операций?
Ответ:
 (1) (((a and b)shr c)mod a)+(c*((a shl(-b))div a))
 
 (2) a and b shr c mod a +(((c*a)shl(-b))div a)
 
 (3) ((a and b)shr c)mod a+c*(a shl -b div a)
 (4) (a and(b shr(c mod a)))+(c*(a shl(-(b div a))))
 
 (5) a and b shr c mod a+(c*(a shl((-b)div a)))
 
 (6) a and b shr c mod a+((c*a) shl(-(b div a)))
 
Номер 2
Какой из вариантов расстановки скобок в выражении a + b or c shl a * c - a mod b > a не меняет порядок выполнения операций?
Ответ:
 (1) a+(((b or c)shl a)*c)-(a mod b)>a 
  (2) a+(b or((c shl a)*c))-a mod(b>a) 
 (3) a+(b or((c shl a)*c))-(a mod b)>a 
 (4) (a+b or c shl a*c-a mod b)>a 
 (5) (a+b or c shl a*c(-a)mod b)>a 
Номер 3
Какие из вариантов расстановки скобок в выражении a * b + not c > a mod c * a shl b xor a не меняют порядок выполнения операций?
Ответ:
 (1) a*b+(not c)>(((a mod c)*a)shl b)xor a
 
 (2) a*b+(not c)>(a mod((c*a)shl b))xor a
 
 ((((a*(b+not c)>a)mod c)*a)shl b)xor a
 
 (4) (a*b+not c)>(a mod c*a shl b)xor a
 
 (5) (a*b)+(not c)>(a mod c)*(a shl b)xor a
 
 (6) (a*b)+(not c)>(a mod (c*(a shl(b xor a))))
 
Главная / Программирование / Программирование на языке Pascal / Тест 2
Битовые операции | Информатика
Во многих языках программирования допустимы логические операции над битами целых чисел. В отличие от обычных логических операций, результатом выполнения которых является логический тип данных, битовые логические операции просто изменяют целое число согласно определенным правилам. Точнее битовые операции изменяют отдельные биты двоичного представления числа, в результате чего изменяется его десятичное значение.
Например, в языке программирования Паскаль обычные логические операции и логические операции над битами обозначают с помощью одних и тех же ключевых слов: not, and, or, xor
. Компилятор определяет, что имелось в виду в зависимости от контекста использования этих слов. Обычные логические операции объединяют два и более простых логических выражения. Например, (a > 0) and (c != b)
, (c < a) or(not b)
и т.п. В свою очередь побитовые логические операции выполняются исключительно над целыми числами (или переменными, которые их содержат). Например, a and b, a or 8, not 247
.
Как понять побитовые операции
1.
6710 = 0100 00112 11410 = 0111 00102
2. Теперь расположим биты второго числа под соответствующими битами первого и выполним обычные логические операции к цифрам, стоящим в одинаковых разрядах первого и второго числа. Например, если в последнем (младшем) разряде одного числа стоит 1, а другого числа — 0, то логическая операция and
вернет 0, а or
вернет 1. Операцию not
применим только к первому числу.
3. Переведем результат в десятичную систему счисления.
01000010 = 26 + 21 = 64 + 2 = 66 01110011 = 26 + 25 + 24 + 21 + 20 = 64 + 32 + 16 + 2 + 1 = 115 00110001 = 25 + 24 + 20 = 32 + 16 + 1 = 49 10111100 = 27 + 25 + 24 + 23 + 22 = 128 + 32 + 16 + 8 + 4 = 188
4. Итак, в результате побитовых логических операций получилось следующее:
67 and 114 = 66 67 or 114 = 115 67 xor 114 = 49 not 67 = 188
Вот еще один пример выполнения логических операций над битами. Проверьте его правильность самостоятельно.
5 and 6 = 4 5 or 6 = 7 5 xor 6 = 3 not 5 = 250
Зачем нужны побитовые логические операции
Глядя на результат побитовых операций, не сразу можно уловить закономерности в их результате. Поэтому непонятно, зачем нужны такие операции. Однако, они находят свое применение. В байтах не всегда хранятся числа. Байт или ячейка памяти может хранить набор флагов (установлен — сброшен), представляющих собой информацию о состоянии чего-либо. С помощью битовых логических операций можно проверить, какие биты в байте установлены в единицу, можно обнулить биты или, наоборот, установить в единицу. Также существует возможность сменить значения битов на противоположные.
Проверка битов
Проверка битов осуществляется с помощью битовой логической операции and
.
Представим, что имеется байт памяти с неизвестным нам содержимым. Известно, что логическая операция and
возвращает 1, если только оба операнда содержат 1. Если к неизвестному числу применить побитовое логическое умножение (операцию and
) на число 255 (что в двоичном представлении 1111 1111), то в результате мы получим неизвестное число. Обнулятся те единицы двоичного представления числа 255, которые будут умножены на разряды неизвестного числа, содержащие 0. Например, пусть неизвестное число 38 (0010 0110), тогда проверка битов будет выглядеть так:
Другими словами, x and 255 = x
.
Обнуление битов
Чтобы обнулить какой-либо бит числа, нужно его логически умножить на 0.
Обратим внимание на следующее:
1111 1110 = 254 = 255 - 1 = 255 - 20 1111 1101 = 253 = 255 - 2 = 255 - 21 1111 1011 = 251 = 255 - 4 = 255 - 22 1111 0111 = 247 = 255 - 8 = 255 - 23 1110 1111 = 239 = 255 - 16 = 255 - 24 1101 1111 = 223 = 255 - 32 = 255 - 25 1011 1111 = 191 = 255 - 64 = 255 - 26 0111 1111 = 127 = 255 - 128 = 255 - 27
Т. е. чтобы обнулить четвертый с конца бит числа x
, надо его логически умножить на 247 или на (255 — 23).
Установка битов в единицу
Для установки битов в единицу используется побитовая логическая операция or
. Если мы логически сложим двоичное представление числа x
с 0000 0000, то получим само число х
. Но вот если мы в каком-нибудь бите второго слагаемого напишем единицу, то в результате в этом бите будет стоять единица.
Отметим также, что:
0000 0001 = 20 = 1 0000 0010 = 21 = 2 0000 0100 = 22 = 4 0000 1000 = 23 = 8 0001 0000 = 24 = 16 0010 0000 = 25 = 32 0100 0000 = 26 = 64 1000 0000 = 27 = 128
Поэтому, например, чтобы установить второй по старшинству бит числа x
в единицу, надо его логически сложить с 64 (x or 64
).
Смена значений битов
Для смены значений битов на противоположные используется битовая операция xor
. Чтобы инвертировать определенный бит числа x
, в такой же по разряду бит второго числа записывают единицу. Если же требуется инвертировать все биты числа x
, то используют побитовую операцию исключающего ИЛИ (xor
) с числом 255 (1111 1111).
Операции побитового циклического сдвига
Помимо побитовых логических операций во многих языках программирования предусмотрены битовые операции циклического сдвига влево или вправо. Например, в языке программирования Паскаль эти операции обозначаются shl
(сдвиг влево) и shr
(сдвиг вправо).
Первым операндом операций сдвига служит целое число, над которым выполняется операция. Во втором операнде указывается, на сколько позиций сдвигаются биты первого числа влево или вправо. Например, 105 shl 3
или 105 shr 4
. Число 105 в двоичном представлении имеет вид 0110 1001.
При сдвиге влево теряются старшие биты исходного числа, на их место становятся младшие. Освободившиеся младшие разряды заполняются нулями.
При сдвиге вправо теряются младшие биты исходного числа, на их место становятся старшие. Освободившиеся старшие разряды заполняются нулями, если исходное число было положительным.
Обработкабит — Преобразование «shr» Паскаля в «>>» C
Задавать вопрос
спросил
Изменено 8 лет, 8 месяцев назад
Просмотрено 350 раз
У меня проблема с переводом некоторого кода Pascal на C. По сути, у меня есть вложенные циклы, где цикл, увеличивающий ‘k’, находится внутри цикла, увеличивающего ‘i’. В обоих случаях я хочу выполнить команду «если я (сдвинут вправо на) k И 1 = 1, то выполните следующий {код}». В Паскале у меня:
{Код Паскаля} . .. для i:=0 до N-1 начинайте j:=0; темп:=N/2; для k:=0 до P-1 действительно начинаются, если ((i shr k) и 1)=1 тогда...
Который, я знаю, работает. Я построил данные из кода Pascal, и они верны, поэтому я предполагаю, что этот алгоритм — то, что я хочу воспроизвести в C. В C у меня есть:
/*код C*/ ... инт я; беззнаковое целое k; для (я = 0; я>k&&1==1){ /*выполнить код*/ }
При отладке этих строк я пишу в файлы, которые показывают значения для «i shr k» в Паскале и «i>>k» в C. Первые несколько строк этих файлов для каждого из них:
Паскаль "i shr k": 0 0 0 0 0 0 0 0 0 1...
Мои результаты C для «i>>k»:
C's "i>>k": 1 2 1 3 1 4 2 1 5 2...
Я также обнаружил, что в версии для Pascal гораздо больше обращений к внутренней части оператора if для заданного значения i. Любая идея о том, что здесь происходит? Я знаю, что «shr» в Паскале — это логический сдвиг, а «>>» в C — арифметический сдвиг, но я подумал, что поместив тип (unsigned int) перед левым операндом «>>», это исправит? У кого-нибудь есть какие-либо советы о том, как сделать мой оператор C эквивалентным оператору Pascal? Было бы очень признательно!
Спасибо за внимание!
- c
- битовые манипуляции
- паскаль
- битовый сдвиг
- сдвиг
9
Ваша проблема связана с приоритетом операторов.
В версии Pascal ваше условие таково:
((i shr k) и 1)=1
В версии C ваше условие таково (с некоторыми скобками, добавленными для обозначения приоритета):
(i >> k) && (1==1)
Кроме того, &&
— это логический оператор, а не побитовый. Эквивалентный побитовый оператор: и
. Если вы добавите скобки и операторы переключения, вы должны получить то, что хотите:
((i >> k ) & 1) == 1
11
Зарегистрируйтесь или войдите
Зарегистрироваться через Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Преобразование некоторой сборки в VB.
NET — оператор SHR работает по-другому?спросил
Изменено 12 лет, 8 месяцев назад
Просмотрено 911 раз
Вот простой вопрос
Я изучаю сборку и конвертирую некоторые процедуры сборки обратно в VB.NET
Теперь, есть определенная строка кода, с которой у меня возникли проблемы, в сборке предположим следующее:
EBX = F0D04080
Затем выполняется следующая строка
SHR EBX, 4
Что дает мне следующее:
EBX = 0F0D0408
Теперь в VB.NET я делаю следующее
переменная = переменная >> 4
Который ДОЛЖЕН дать мне то же самое… Но он НЕМНОГО отличается, вместо значения 0F0D0408 я получаю FF0D0408
Что здесь происходит?
- vb. net
- сборка
- бит-шифт
- разборка
Из документации оператора >>:
При арифметическом сдвиге вправо биты, сдвинутые за крайнюю правую битовую позицию, отбрасываются, а крайний левый (знаковый) бит распространяется на битовые позиции, освободившиеся слева. Это означает, что если шаблон имеет отрицательное значение, освободившиеся позиции устанавливаются равными единице; в противном случае они устанавливаются равными нулю.
Если вы используете тип данных со знаком, F0B04080
имеет отрицательный знак (бит 1
в начале), который копируется на освободившиеся позиции слева.
Это не что-то конкретное для VB.NET, кстати: переменная >> 4
транслируется в IL-инструкцию shr
, которая является «арифметическим сдвигом» и сохраняет знак, в отличие от сборки x86 инструкция SHR
, которая является сдвигом без знака. Чтобы сделать арифметический сдвиг в ассемблере x86, SAR
можно использовать.