Какого типа будет результат операции 4 2
Как мы уже упоминали, для каждого типа данных определены действия, применимые к его значениям. Например, если переменная относится к порядковому типу данных , то она может фигурировать в качестве аргумента стандартных функций Ord () , Pred () и Succ () (см. п. « Совместимость типов данных » ниже). А к вещественным типам эти функции применить невозможно.
Итак, поговорим теперь об операциях — стандартных действиях, разрешённых для переменных того или иного базового типа данных. Основу будут составлять арифметические операции , но, конечно же, мы не забудем и о логическом типе данных (операции, определённые для значений символьного типа , будут подробно рассмотрены в лекции 5 ).
Замечание: Все перечисленные ниже операции (за исключением унарных «-» , «+» и not ) требуют двух операндов.
-
Логические операции (and, or, not, xor) применимы только к значениям типа Boolean . Их результатом также служат величины типа Boolean . Приведём таблицы значений для этих операций:
Оператор | Операнд 1 | Операнд 2 | Результат |
---|---|---|---|
not | False | — | True |
True | — | False | |
and | False | False | False |
False | True | False | |
True | False | False | |
True | True | True | |
or | False | False | False |
False | True | True | |
True | False | True | |
True | True | True | |
xor | False | False | False |
False | True | True | |
True | False | True | |
True | True | False |
a div b — деление а на b нацело (не нужно, наверное, напоминать, что деление на 0 запрещено, поэтому в таких случаях операция выдаёт ошибку). Результат будет принадлежать к типу данных, общему для тех типов, к которым принадлежат операнды. Например, (ShortInt div Byte = Integer). Пояснить это можно так: Integer — это минимальный тип, подмножествами которого являются одновременно и Byte , и ShortInt . a mod b — взятие остатка при делении а на b нацело. Тип результата, как и в предыдущем случае, определяется типами операндов, а 0 является запрещённым значением для b. В отличие от математической операции mod, результатом которой всегда является неотрицательное число, знак результата «программистской» операции mod определяется знаком её первого операнда. Таким образом, если в математике (-2 mod 5) = 3, то у нас (-2 mod 5) = -2. a shl k — сдвиг значения а на k битов влево (это эквивалентно умножению значения переменной а на 2 k ). Результат операции будет иметь тот же тип, что и первый её операнд (а). a shr k — сдвиг значения а на k битов вправо (это эквивалентно делению значения переменной а на 2 k нацело). Результат операции будет иметь тот же тип, что и первый её операнд (а). and, or, not, xor — операции двоичной арифметики , работающие с битами двоичного представления целых чисел, по тем же правилам, что и соответствующие им логические операции .
Другие операции
Помимо арифметических, существуют и другие операции, специфичные для значений некоторых стандартных типов данных языка Pascal. Эти операции мы рассмотрим в соответствующих разделах:
Стандартные арифметические функции
К арифметическим операциям примыкают и стандартные арифметические функции . Их список с кратким описанием мы приводим в таблице.
Описание | Тип аргумента | Тип результата 1 | |
---|---|---|---|
Abs (x) | Абсолютное значение (модуль) числа | Арифметический | Совпадает с типом аргумента |
ArcTan (x) | Арктангенс (в радианах) | Арифметический | Вещественный |
Cos (x) | Косинус (в радианах) | Арифметический | Вещественный |
Exp (x) | Экспонента (e x ) | Арифметический | Вещественный |
Frac (x) | Взятие дробной части числа | Арифметический | Вещественный |
Int (x) | Взятие целой части числа | Арифметический | Вещественный |
Ln (x) | Натуральный логарифм (по основанию e) | Арифметический | Вещественный |
Odd (x) | Проверка нечётности числа | Целый | Boolean |
Pi | Значение числа π | — | Вещественный |
Round (x) | Округление к ближайшему целому | Арифметический | Целый |
Trunc (x) | Округление «вниз» — к ближайшему меньшему целому | Арифметический | Целый |
Sin (x) | Синус (в радианах) | Арифметический | Вещественный |
Sqr (x) | Возведение в квадрат | Арифметический | Совпадает с типом аргумента |
Sqrt (x) | Извлечение квадратного корня | Арифметический | Вещественный |
Арифметические выражения
Все арифметические операции можно сочетать друг с другом — конечно, с учётом допустимых для их операндов типов данных.
В роли операндов любой операции могут выступать переменные, константы, вызовы функций или выражения, построенные на основе других операций. Всё вместе и называется выражением . Определение выражения через выражение не должно вас смущать, ведь рекурсивное задание конструкций вообще свойственно программированию (см. лекцию 9 ).
(x < 0) and (y > 0) — выражение, результат которого принадлежит к типу Boolean ;
z shl Abs (k) — вторым операндом является вызов стандартной функции;
(x mod k) + Min(a,b) + Trunc (z) — сочетание арифметических операций и вызовов функций;
Odd ( Round (x / Abs (x))) — «многоэтажное» выражение.
Полнота вычислений
if (xто для случая, когда x положительно, этих сложных вычислений можно избежать.
Порядок вычислений
Если в выражении расставлены скобки, то вычисления производятся в порядке, известном всем ещё с начальной школы: чем меньше глубина вложенности скобок, тем позже вычисляется заключённая в них операция. Если же скобок нет, то сначала вычисляются значения операций с более высоким приоритетом , затем — с менее высоким. Несколько подряд идущих операций одного приоритета вычисляются в последовательности «слева направо».
Таблица 2.1. Приоритеты (для всех) операций языка Pascal | Операции | Приоритет |
---|---|---|
Унарные 2 операции | +, -, not, @, ^, # | Первый(высший) |
Операции, эквивалентные умножению | *, /, div, mod, and, shl, shr | Второй |
Операции, эквивалентные сложению | +, -, or, xor | Третий |
Операции сравнения | =, <>, >, =, in | Четвёртый |
Замечание: Вызов любой функции имеет более высокий приоритет, чем все внешние относительно этого вызова операции. Выражения, являющиеся аргументами вызываемой функции, вычисляются в момент вызова (см. лекцию 8 ).
Примеры выражений (с указанием последовательности вычислений) для целых чисел:
страницы: 1 2 3
Результат операции 4 2 в Python: всегда числовой
В программировании важно понимать типы данных, с которыми мы работаем. Тип данных определяет, какие операции можно выполнять с переменной, а также как память выделяется для хранения значения этой переменной. Например, для выполнения операции сложения чисел необходимо знать их тип.
В данной статье рассмотрим тип данных для операции сложения двух чисел — 4 и 2. В нашем примере мы имеем два числа с плавающей точкой, поэтому будем использовать тип данных float. Этот тип данных представляет числа с плавающей точкой, то есть числа, которые могут иметь дробную и целую части.
В языке программирования Python можно выполнить операцию сложения двух чисел с помощью оператора «+». Пример кода для этой операции выглядит следующим образом:
В данном случае результатом операции будет число 6. При этом тип данных переменной result также будет float. Это связано с тем, что Python автоматически определяет тип данных переменной на основе типов операндов.
Тип данных
В программировании каждое значение имеет свой тип данных, который определяет, как оно будет обрабатываться и в каком виде будет представлено в памяти компьютера. Тип данных также определяет операции, которые могут быть выполнены над этим значением.
Одним из основных типов данных является числовой тип данных. Он предназначен для работы с числами, и включает в себя такие типы, как целые числа (integer) и числа с плавающей запятой (float). Например, результат операции 4 + 2 будет иметь тип данных integer и будет равен 6.
Также существует текстовый тип данных (string), который предназначен для хранения и обработки текстовых данных. Например, «Hello, world!» будет иметь тип данных string.
Булевый тип данных (boolean) представляет собой логическое значение, которое может быть либо истинным (true), либо ложным (false). Он часто используется для проверки условий в программе.
Также существуют и другие типы данных, такие как массивы (array), объекты (object), символы (char), списки (list) и др. Каждый из этих типов данных имеет свои особенности и предназначен для работы с определенными видами данных.
Важно помнить, что тип данных определяется не только самим значением, но и контекстом, в котором оно используется. Например, число 5 может быть как целым числом, так и числом с плавающей запятой, в зависимости от того, как оно используется в программе.
В языках программирования обычно существуют специальные функции или операторы, которые позволяют определить тип данных значения. Например, в Python можно использовать функцию type() для определения типа данных.
Операция сложения
Операция сложения – одна из основных арифметических операций, которая выполняется с двумя или более числами и возвращает их сумму.
В математике сложение обозначается знаком «+». Например, для сложения чисел 4 и 2 запись будет выглядеть следующим образом: 4 + 2.
Результатом операции сложения будет число, которое является суммой всех слагаемых.
Операция сложения может быть применена к разным типам данных. Например:
- Сложение целых чисел: 4 + 2 = 6
- Сложение десятичных чисел: 3.14 + 2.71 = 5.85
- Сложение чисел с плавающей точкой: 2.5 + 1.75 = 4.25
- Сложение чисел в научной нотации: 1.5e6 + 2.3e6 = 3.8e6
В программировании результатом операции сложения может быть не только число, но и другой тип данных, например строка.
Например, операция сложения строк называется конкатенацией. При конкатенации двух строк результатом будет новая строка, которая содержит все символы исходных строк, последовательно объединенные в одну строку.
Операция | Результат |
---|---|
«Hello, » + «world!» | «Hello, world!» |
«4 + 2 = » + (4 + 2) | «4 + 2 = 6» |
Таким образом, операция сложения является важной для математики и программирования, и позволяет выполнять различные вычисления и объединять данные разного типа.
Четыре плюс два
Операция сложения является одним из простейших арифметических действий, которое мы изучаем еще в школе. В данном случае мы складываем числа 4 и 2.
После выполнения операции сложения, получаем результат: 6.
Результат может быть представлен в разных форматах, в том числе в подходящем типе данных. В данном случае, результатом операции 4 + 2 является целое число.
Целые числа представлены без дробной части, то есть они могут быть положительными, отрицательными или нулем. В данном случае результат положительный и равен шести.
В языке программирования Java, результат операции 4 + 2 можно сохранить в переменной типа int:
int result = 4 + 2;
Теперь переменная result будет содержать значение 6.
При работе с числами и выполнении арифметических операций, важно учитывать типы данных, чтобы избежать ошибок и получить корректные результаты.
Результат сложения
Результат сложения двух чисел — это сумма этих чисел, которая получается путем объединения их значения.
Сумма может быть вычислена для различных типов данных, включая целые числа, числа с плавающей точкой и строки.
При сложении двух целых чисел получается новое целое число, которое является арифметической суммой исходных чисел.
При сложении двух чисел с плавающей точкой также получается новое число с плавающей точкой, которое является суммой исходных чисел с учетом их десятичной части.
Если одно из слагаемых является строкой, то происходит операция конкатенации — сложение строк. Например, результатом сложения «4» и «2» будет строка «42».
В языках программирования результат сложения возвращается в виде значения, которое можно сохранить в переменной или использовать в дальнейших вычислениях.
Вывод информации о типе
Когда нам нужно узнать тип значения (переменной или выражения), мы можем использовать функцию type(). Функция type() возвращает тип значения в виде объекта класса type.
Вот простой пример использования функции type():
В данном случае функция type() вернет следующий результат:
Тип | Результат |
---|---|
int |
Таким образом, мы узнали, что значение переменной x имеет тип int (целое число).
Кроме типов данных, в Python есть также встроенная функция isinstance(), которая проверяет, принадлежит ли значение определенному типу. Эта функция возвращает True, если значение принадлежит указанному типу, и False в противном случае.
Вот пример использования функции isinstance():
В этом случае функция isinstance() вернет следующий результат:
Тип | Результат |
---|---|
True |
Таким образом, мы узнали, что значение переменной x является целым числом (int).
Вывод информации о типе данных очень полезен при отладке программы и позволяет убедиться в том, что мы работаем с правильными типами данных и выполняем правильные операции с ними.
Вопрос-ответ
Каков результат операции 4 + 2?
Результатом операции 4 + 2 является число 6.
Какой тип данных имеет результат операции 4 + 2?
Результат операции 4 + 2 является числом и имеет тип данных integer.
Что произойдет, если сложить число 4 и число 2?
Если сложить число 4 и число 2, то получится число 6.
Как вычислить сумму чисел 4 и 2 на языке программирования?
Для вычисления суммы чисел 4 и 2 на языке программирования, нужно использовать оператор сложения «+». В результате операции получится число 6.
Является ли результат операции 4 + 2 целым числом?
Да, результат операции 4 + 2 является целым числом. Оно равно 6 и имеет тип данных integer.
Побитовые операции
Побитовые операции (англ. bitwise operations) — операции, производимые над цепочками битов. Выделяют два типа побитовых операций: логические операции и побитовые сдвиги.
Принцип работы
Логические побитовые операции
Битовые операторы И [math](AND,\ \&)[/math] , ИЛИ [math](OR,\ \mid)[/math] , НЕ [math](NOT,\ \sim)[/math] и исключающее ИЛИ [math](XOR,\ $\textasciicircum$,\ \oplus)[/math] используют те же таблицы истинности, что и их логические эквиваленты.
Побитовое И
Побитовое И используется для выключения битов. Любой бит, установленный в [math]0[/math] , вызывает установку соответствующего бита результата также в [math]0[/math] .
& |
---|
11001010 11100010 |
11000010 |
Побитовое ИЛИ
Побитовое ИЛИ используется для включения битов. Любой бит, установленный в [math]1[/math] , вызывает установку соответствующего бита результата также в [math]1[/math] .
| |
---|
11001010 11100010 |
11101010 |
Побитовое НЕ
Побитовое НЕ инвертирует состояние каждого бита исходной переменной.
~ |
---|
11001010 |
00110101 |
Побитовое исключающее ИЛИ
Исключающее ИЛИ устанавливает значение бита результата в [math]1[/math] , если значения в соответствующих битах исходных переменных различны.
^ |
---|
11001010 11100010 |
00101000 |
Побитовые сдвиги
Операторы сдвига [math]\lt \lt [/math] и [math]<\gt \gt >[/math] сдвигают биты в переменной влево или вправо на указанное число. При этом на освободившиеся позиции устанавливаются нули (кроме сдвига вправо отрицательного числа, в этом случае на свободные позиции устанавливаются единицы, так как числа представляются в двоичном дополнительном коде и необходимо поддерживать знаковый бит).
Сдвиг влево может применяться для умножения числа на два, сдвиг вправо — для деления.
x = 7 // 00000111 (7) x = x >> 1 // 00000011 (3) x = x // 00000110 (6) x = x // 11000000 (-64) x = x >> 2 // 11110000 (-16)
В языке программирования Java существует также оператор беззнакового битового сдвига вправо [math]\gt \gt \gt [/math] . При использовании этого оператора на освободившиеся позиции всегда устанавливаются нули.
x = 7 // 00000111 (7) x = x // 11100000 (-32) x = x >>> 2 // 00111000 (56)
Применение
Сложные операции
Определение знака числа
Пусть дано число [math]x[/math] . Поскольку при сдвиге вправо на освобождающиеся позиции устанавливается бит знака, знак числа [math]x[/math] можно определить, выполнив сдвиг вправо на всю длину переменной:
int32 getSign(x: int32): if x != 0: mask = 1 else: mask = 0 return mask | (x >> 31) // результатом будет -1, 0, или +1 // для отрицательного, равного нулю и положительного числа x соответственно
Используя побитовые операции можно также узнать, различны ли знаки двух переменных [math]x[/math] и [math]y[/math] . Если числа имеют различный знак, то результат операции XOR, произведенной над их знаковыми битами, будет единицей. Поэтому неравенство [math](x \oplus y) \lt 0[/math] будет верно в том случае, если числа [math]x[/math] и [math]y[/math] разного знака.
Вычисление модуля числа без использования условного оператора
Пусть дано число [math]x[/math] . Если [math]x[/math] положительно, то [math]mask = 0[/math] , и [math](x + mask) \oplus mask = x[/math] . В случае, если [math]x[/math] отрицательно, [math]mask = -1[/math] . Тогда получается, что мы работаем с числом [math]x[/math] так, как будто оно представлено в коде со сдвигом с тем отличием, что у нас знаковый бит принимает значение [math]1[/math] для отрицательных чисел, а [math]0[/math] — для положительных.
int32 abs1(x: int32): mask = x >> 31 return (x + mask) XOR mask int32 abs2(x: int32): mask = x >> 31 return (x + mask) XOR mask
Нахождение минимума и максимума из двух чисел без использования условного оператора
Этот способ корректен только если можно утверждать, что величина [math](x - y)[/math] лежит между граничными значениями типа int.
Пусть даны числа [math]x[/math] и [math]y[/math] разрядности [math]n[/math] . Тогда если [math]x \lt y[/math] , то [math]((x - y) \gt \gt (n - 1)) = -1[/math] , а если [math]x \geqslant y[/math] , то [math]((x - y) \gt \gt (n - 1)) = 0[/math] . Выражение [math]((x - y) \& ((x - y) \gt \gt (n - 1))[/math] принимает значение [math]0[/math] , если [math]x \geqslant y[/math] , и [math](x - y)[/math] , если [math]x \lt y[/math] .
int32 min(x, y: int32): return y + ((x - y) & ((x - y) >> 31)) int32 max(x, y: int32): return x - ((x - y) & ((x - y) >> 31))
Проверка на то, является ли число степенью двойки
Пусть дано число [math]x[/math] . Тогда, если результатом выражения [math](x\ \&\&\ !(x\ \&\ (x - 1)))[/math] является единица, то число [math]x[/math] — степень двойки.
Правая часть выражения [math](!(x\ \&\ (x - 1)))[/math] будет равна единице, только если число [math]x[/math] равно [math]0[/math] или является степенью двойки. Если число [math]x[/math] является степенью двойки, то в двоичной системе счисления оно представляется следующим образом: [math]1\underbrace_[/math] , где [math]n[/math] — показатель степени. Соответственно, выражение [math](x - 1)[/math] будет иметь вид [math]\underbrace_[/math] , и [math]x\ \&\ (x - 1)[/math] равно [math]0[/math] .
Операция логического И в данном выражении отсекает тот случай, когда [math](x = 0)[/math] и не является степенью двойки, но при этом правая часть [math](!(x\ \&\ (x - 1)))[/math] равна единице.
Нахождение младшего единичного бита
Пусть дано число [math]x[/math] и необходимо узнать его младший единичный бит.
Применим к числу [math]x[/math] побитовое отрицание, чтобы инвертировать значения всех его бит, а затем прибавим к полученному числу единицу. У результата первая часть (до младшего единичного бита) не совпадает с исходным числом [math]x[/math] , а вторая часть совпадает. Применив побитовое И к этим двум числам, получим степень двойки, соответствующую младшему единичному биту исходного числа [math](x\ \&\ (\sim x + 1))[/math] .
К такому же результату можно прийти, если сначала отнять от числа [math]x[/math] единицу, чтобы обнулить его младший единичный бит, а все последующие разряды обратить в [math]1[/math] , затем инвертировать результат и применить побитовое И с исходным числом [math](x\ \&\ \sim (x - 1))[/math] .
Нахождение старшего единичного бита
Пусть дано число [math]x[/math] и необходимо узнать его старший единичный бит.
Рассмотрим некоторое число, представим его как [math]0\dots01b \dots b[/math] , где [math]b[/math] — любое значение бита. Тогда, если совершить битовый сдвиг этого числа вправо на [math]1[/math] и произвести побитовое ИЛИ результата сдвига и исходного числа, мы получим результат [math]0\dots011b \dots b[/math] . Если мы повторим эту последовательность действий над полученным числом, но устроим сдвиг на [math]2[/math] , то получим [math]0\dots01111b \dots b[/math] . При каждой следующей операции будем увеличивать модуль сдвига до следующей степени двойки. После некоторого количества таких операций (зависит от разрядности числа) мы получим число вида [math]0\dots01\dots1[/math] . Тогда результатом выполнения действий [math]x - (x \texttt< \gt \gt >1)[/math] будет число, состоящее только из старшего бита исходного числа.
int32 greatestBit(x: int32): power = 1 for i = 1
: x |= x >> power power return x - (x >> 1)Циклический сдвиг
Пусть дано число [math]x[/math] и надо совершить циклический сдвиг его битов на величину [math]d[/math] . Желаемый результат можно получить, если объединить числа, полученные при выполнении обычного битового сдвига в желаемую сторону на [math]d[/math] и в противоположном направлении на разность между разрядностью числа и величиной сдвига. Таким образом, мы сможем поменять местами начальную и конечную части числа.
int32 rotateLeft(x, d: int32): return (x >> (32 - d)) int32 rotateRight(x, d: int32): return (x >>> d) | (xПодсчет количества единичных битов
Для подсчета количества единичных битов в числе [math]x[/math] можно воспользоваться следующим алгоритмом:
// Для чисел других разрядностей необходимо использовать соответствующие константы. int16 setBitsNumber(x: int16): x = x - ((x >>> 1) & 0x5555) x = (x & 0x3333) + ((x >>> 2) & 0x3333) x = (x + (x >>> 4)) & 0x0F0F return (x * 0x0101) >>> 8Поскольку [math]5555_[/math] равно [math]01010101 01010101_[/math] , результатом операции [math]x\ \&\ 5555_[/math] является число, в котором все нечетные биты соответствуют нечетным битам числа [math]x[/math] . Аналогично, результатом операции [math](x\ \texttt<\gt \gt \gt >\ 1)\ \&\ 5555_[/math] является число, в котором все нечетные биты соответствуют четным битам [math]x[/math] . Четные биты результата в обоих случаях равны нулю.
Мысленно разобьем двоичную запись нашего числа [math]x[/math] на группы по [math]2[/math] бита. Результатом операции [math]x\ \&\ 5555_ + (x\ \texttt<\gt \gt \gt >\ 1)\ \&\ 5555_[/math] будет такое число, что если разбить его двоичную запись на группы по два бита, значение каждой группы соответствует количеству единичных битов в соответствующей паре битов числа [math]x[/math] .
Аналогично, число [math]3333_[/math] равно [math]00110011 00110011_[/math] и операция [math]x = (x\ \&\ 3333_) + (x\ \texttt<\gt \gt \gt >\ 2\ \&\ 3333_)[/math] , примененная к результату, полученному на первом этапе, выполняет подсчет количества единичных битов в блоках по [math]4[/math] . В свою очередь, число [math]\texttt_[/math] равно [math]00001111 00001111_[/math] и операция [math]x = (x\ \&\ \texttt_) + (x\ \texttt<\gt \gt \gt >\ 4\ \&\ \texttt_)[/math] позволяет подсчитать число единичных бит в блоках по [math]8[/math] .
Теперь необходимо просуммировать числа, записанные в блоках по [math]8[/math] битов, чтобы получить искомую величину. Это можно сделать, домножив результат на [math]0101_[/math] [math](1 00000001_)[/math] . Ответ на задачу будет находиться в первых восьми битах произведения. Выполнив сдвиг вправо на [math]8[/math] (для шестнадцатибитных чисел), мы получим долгожданный ответ.
int16 setBitsNumber(x: int16): x = (x & 0x5555) + ((x >>> 1) & 0x5555) x = (x & 0x3333) + ((x >>> 2) & 0x3333) x = (x & 0x0F0F) + ((x >>> 4) & 0x0F0F) return (x * 0x0101) >>> 8Заметим, что операция [math]x\ \&\ 55_ + (x\ \texttt<\gt \gt \gt >\ 1)\ \&\ 55_[/math] равносильна операции [math]x - (x\ \texttt<\gt \gt \gt >\ 1)\ \&\ 55_[/math] , в чем легко убедиться, рассмотрев все числа из двух бит.
В свою очередь, операцию [math](x\ \&\ \texttt_) + ((x\ \texttt<\gt \gt \gt >\ 4)\ \&\ \texttt_)[/math] можно заменить на [math](x + (x\ \texttt<\gt \gt \gt >\ 4))\ \&\ \texttt_[/math] . Эта замена не повлияет на результат, так как максимальное значение в любой группе из четырех битов данного числа равно четырем, то есть требует только трех битов для записи, и выполнение суммирования не повлечет за собой переполнения и выхода за пределы четверок.
Таким образом, мы получили код, приведенный в начале раздела.
Разворот битов
Чтобы получить биты числа [math]x[/math] , записанные в обратном порядке, применим следующий алгоритм.
// Для чисел других разрядностей нужны соответствующие константы. int16 reverseBits(x: int16): x = ((x & 0x5555) >> 1) & 0x5555) // Четные и нечетные биты поменялись местами. x = ((x & 0x3333) >> 2) & 0x3333) // Биты "перетасовываются" группами по два. x = ((x & 0x0F0F) >> 4) & 0x0F0F) // Биты "перетасовываются" группами по четыре. x = ((x & 0x00FF) >> 8) & 0x00FF) // Биты "перетасовываются" группами по восемь. return xБолее подробно про то, что за константы выбраны для данного алгоритма, можно прочитать в разделе подсчет количества единичных битов.
Применение для решения задач
Работа с битовыми масками
Для работы с подмножествами удобно использовать битовые маски. Применяя побитовые операции легко сделать следующее: найти дополнение [math](\sim mask)[/math] , пересечение [math](mask_1\ \&\ mask_2)[/math] , объединение [math](mask_1 \mid mask_2)[/math] множеств, установить бит по номеру [math](mask \mid (1\ \texttt<\lt \lt >\ x))[/math] , снять бит по номеру [math](mask\ \&\ \sim(1\ \texttt<\lt \lt >\ x))[/math] .
Битовые маски используются, например, при решении некоторых задач [1] динамического программирования.
Алгоритм Флойда
Основная статья: Алгоритм Флойда
Алгоритм Флойда–Уоршелла (англ. the Floyd–Warshall algorithm) — алгоритм для нахождения длин кратчайших путей между всеми парами вершин во взвешенном ориентированном графе. Работает корректно, если в графе нет циклов отрицательной величины, а если же такой цикл есть, позволяет найти хотя бы один такой цикл. Асимптотическая сложность алгоритма [math] \Theta(n^3) [/math] , также требует [math] \Theta(n^2) [/math] памяти.
Дерево Фенвика
Основная статья: Дерево Фенвика
Дерево Фенвика (англ. Binary indexed tree) — структура данных, которая может выполнять следующие операции:
- изменять значение любого элемента в массиве,
- выполнять некоторую ассоциативную, коммутативную, обратимую операцию [math] \circ [/math] на отрезке [math] [i, j] [/math] .
Данная структура требует [math] O(n) [/math] памяти, а выполнение каждой операции происходит за [math] O(\log n) [/math] .
Функция, позволяющая делать операции вставки и изменения элемента за [math] O(\log n) [/math] , задается следующей формулой [math] F(i) = (i \And (i + 1)) [/math] . Пусть дан массив [math] A = [a_0, a_1, \ldots, a_][/math] . Деревом Фенвика называется массив [math] T [/math] из [math] n [/math] элементов: [math] T_i = \sum\limits_^ a_k[/math] , где [math] i = 0\ldots n - 1 [/math] и [math] F(i) [/math] — функция, которую мы определили ранее.
См. также
- Определение булевой функции
- Сумматор
- Триггеры
Примечания
Источники информации
- Онлайн справочник программиста на С и С++
- Побитовые операторы
- Bit Twiddling Hacks by Sean Eron Anderson
- Habrahabr — Алгоритмы поиска старшего бита
- STP's blog — Counting the number of set bits in an integer
Решение модуля 4.2 «Поколение Python» stepik.org
В этом уроке идут задания на отработку логических операторов: and, or и not. На этой странице представлены все решения задач из этого модуля (урока).
Расположите логические операторы в порядке значимости их приоритета (от наибольшего до наименьшего).
- Логическое отрицание not
- Логическое умножение and
- Логическое сложение or
Приведенная ниже таблица истинности показывает разные комбинации истинности и ложности значений, соединённых логическими операторами. Заполните таблицу, выбрав True или False, чтобы показать, является результатом такой комбинации истина или ложь.
True and False – False
True and True – True
False and True – False
False and False – False
True or False – True
True or True – True
False or True – True
False or False – False
not True – False
not False – True
Приведенная ниже таблица истинности показывает разные комбинации истинности и ложности значений, соединённых логическими операторами. Заполните таблицу, выбрав True или False, чтобы показать, является результатом такой комбинации истина или ложь.
Логическое выражение | True | False |
---|---|---|
a == 2 or b > 2 | + | |
6 3 | + | |
1 != b and c != 3 | + | |
a >= -1 or a | + | |
not (a > 2) | + | |
not (c | + |
Что будет выведено на экран в результате выполнения следующей программы?
num1 = 34 num2 = 81 if num1 // 9 == 0 or num2 % 9 == 0: print('число', num1, 'выиграло') else: print('число', num2, 'выиграло')
Ответ: число 34 выиграло
Какое значение будет выведено на экран после выполнения следующей программы, если с клавиатуры введено число 7?
a = int(input()) if a >= 2 and a
Ответ: 100
Принадлежность 1
Напишите программу, которая принимает целое число xx и определяет, принадлежит ли данное число указанному промежутку.
# Получаем целое число и сохраняем его в переменной a a = int(input()) # Проверяем, если число a больше или равно 0 и меньше 17 if a > -1 and a < 17: print('Принадлежит') else: print('Не принадлежит')
Принадлежность 2
Напишите программу, которая принимает целое число xx и определяет, принадлежит ли данное число указанным промежуткам.
# Получаем целое число и сохраняем его в переменной n n = int(input()) # Проверяем, если число n НЕ принадлежит интервалу от -3 до 7 if not (-3 < n < 7): print('Принадлежит') else: print('Не принадлежит')
Принадлежность 3
Напишите программу, которая принимает целое число xx и определяет, принадлежит ли данное число указанным промежуткам.
# Получаем целое число и сохраняем его в переменной a a = int(input()) # Проверяем, если число a принадлежит одному из двух интервалов: # - от -30 (включительно) до -2 (исключительно) # - от 7 (включительно) до 25 (включительно) if (a > -30 and a 7 and aКрасивое число ?️
Назовем число красивым, если оно является четырехзначным и делится нацело на 77 или на 1717. Напишите программу, определяющую, является ли введённое число красивым. Программа должна вывести «YES», если число является красивым, или «NO» в противном случае.
# Получаем целое число и сохраняем его в переменной a a = int(input()) # Проверяем, если число a кратно 7 или кратно 17 и находится в диапазоне от 1000 до 9999 включительно if (a % 7 == 0 or a % 17 == 0) and (a >= 1000 and aНеравенство треугольника
Напишите программу, которая принимает три положительных числа и определяет, существует ли невырожденный треугольник с такими сторонами.
# Получаем целые числа и сохраняем их в переменных a, b и c a = int(input()) b = int(input()) c = int(input()) # Проверяем, выполняется ли неравенство треугольника для заданных сторон if (a < (b + c)) and (b < (a + c)) and (c < (a + b)): print("YES") else: print("NO")Високосный год
Напишите программу, которая определяет, является ли год с данным номером високосным. Если год является високосным, то выведите «YES», иначе выведите «NO».
Год является високосным, если его номер кратен 4, но не кратен 100, или если он кратен 400.
# Получаем год и сохраняем его в переменной year year = int(input()) # Проверяем, выполняются ли условия для високосного года: # Год делится на 4 без остатка, # Год не делится на 100 без остатка, за исключением случаев, когда год делится на 400 без остатка. if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: print('YES') else: print('NO')Ход ладьи
Даны две различные клетки шахматной доски. Напишите программу, которая определяет, может ли ладья попасть с первой клетки на вторую одним ходом. Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки. Программа должна вывести «YES», если из первой клетки ходом ладьи можно попасть во вторую, или «NO» в противном случае.
# Получаем четыре координаты и сохраняем их в переменных r1, c1, r2, c2 r1, c1, r2, c2 = int(input()), int(input()), int(input()), int(input()) # Если строка откуда куда равны r1 == r2 # Или столбец откуда куда равны c1 == c2 if r1 == r2 or c1 == c2: print('YES') else: print('NO')Ход короля
Даны две различные клетки шахматной доски. Напишите программу, которая определяет, может ли король попасть с первой клетки на вторую одним ходом. Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки. Программа должна вывести «YES», если из первой клетки ходом короля можно попасть во вторую, или «NO» в противном случае.
# Получаем четыре координаты и сохраняем их в переменных x1, y1, x2, y2 x1 = int(input()) y1 = int(input()) x2 = int(input()) y2 = int(input()) # Вычисляем разность координат по осям x и y для определения хода короля x = x2 - x1 # разность координат по оси x y = y2 - y1 # разность координат по оси y # так как король может ходить во все направления, но только на одну клетку. if -1Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы