Побитовые операторы в программировании
Побитовые операторы интерпретируют операнды как последовательность из 32 битов (нулей и единиц). Они производят операции, используя двоичное представление числа, и возвращают новую последовательность из 32 бит (число) в качестве результата.
Вложенные циклы
Возможны случаи, когда внутри тела цикла необходимо повторять некоторую последовательность операторов, т. е. организовать внутренний цикл. Такая структура получила название цикла в цикле или вложенных циклов. Глубина вложения циклов (то есть количество вложенных друг в друга циклов) может быть различной.
Пример вложенных циклов
Задача | Решение |
---|---|
Вычислить сумму элементов заданной матрицы A(5,3) | … |
Вычислить произведение элементов матрицы A(10,10) на пересечении четных строк и столбцов | … |
Словесный способ записи алгоритмов
Словесный способ записи алгоритмов представляет собой описание последовательных этапов обработки данных. Алгоритм задается в произвольном изложении на естественном языке.
Пример алгоритма
- Найти последовательно наименьшее число из двух заданных чисел.
- Повторять шаг 1 до тех пор, пока не будет найдено общее минимальное число.
Исполнитель алгоритма
Исполнитель алгоритма — это некоторая абстрактная или реальная система, способная выполнить действия, предписываемые алгоритмом. Обычно исполнитель ничего не знает о цели алгоритма. Он выполняет все полученные команды, не задавая вопросов почему и зачем.
В информатике универсальным исполнителем алгоритмов является компьютер.
Итерационные циклы
Циклы, которые повторяют исполнение блока команд до тех пор, пока не будет достигнуто определенное условие, называются итерационными циклами. Они позволяют эффективно обрабатывать повторяющиеся операции в программах.
В данной статье мы рассмотрели основные принципы работы с побитовыми операторами, вложенными циклами, словесным способом записи алгоритмов и ролью исполнителя алгоритма в информатике. Для эффективного программирования важно понимать эти концепции и уметь применять их на практике.
Итерационный цикл и его особенности
Особенностью итерационного цикла является то, что число повторений операторов тела цикла заранее неизвестно. Для его организации используется цикл типа пока. Выход из итерационного цикла осуществляется в случае выполнения заданного условия.
На каждом шаге вычислений происходит последовательное приближение к искомому результату и проверка условия достижения последнего.
Пример вычисления бесконечной суммы с заданной точностью
Для данной знакочередующейся бесконечной суммы требуемая точность будет достигнута, когда очередное слагаемое станет по абсолютной величине меньше.
Составление алгоритма
Вычисление суммы является типичной циклической задачей. Нашей задачей является вычисление бесконечной суммы, где число слагаемых заранее неизвестно, и выполнение цикла завершается при достижении требуемой точности.
При составлении алгоритма учитывается чередование знаков слагаемых и возрастание степени числа в числителях слагаемых.
Сравнение подходов
Одним из подходов к решению задачи является вычисление частичной суммы на каждом i-ом шаге. Это позволяет последовательно приближаться к результату. Сравнение двух подходов может быть проведено по числу операций.
Алгоритм на школьном языке
Блок-схема алгоритма, включающего итерационный цикл, называется итерационным алгоритмом. Такие алгоритмы используются при реализации численных методов.
Необходимо обеспечить обязательное достижение условия выхода из цикла (сходимость итерационного процесса), чтобы избежать зацикливания алгоритма, что может привести к его неэффективности.
Побитовая операция И (&)
Операция И выполняет операцию над каждой парой бит и возвращает 1 только в случае, если оба бита равны 1.
Таблица истинности для операции И представлена выше.
Запись арифметических выражений
Арифметические выражения записываются с помощью определенных правил. Приведены примеры записи выражений.
Примеры выражений
- x * y / z
- x / ( y * z ) или x / y / z
- ( a3 + b3 ) / ( b*c )
- ( -b + sqrt(bb – 4ac)) / ( 2a )
- (x<0) sign(x) * abs(x) ** (1/5)
- 0.49 * exp(aa – bb) + ln(cos(a*a)) ** 3
- x/(1 + xx/(3 + (2x)**3)
Также приведены типичные ошибки в записи выражений для обучения.
Компоненты алгоритмического языка
Алгоритмический язык состоит из трех основных компонентов: алфавита, синтаксиса и семантики.
Алфавит представляет собой набор символов, из которых состоят тексты на данном языке. Синтаксис определяет правила комбинирования символов, а семантика – их значения.
Этот текст представляет информацию о итерационных циклах, побитовых операциях, записи арифметических выражений и компонентах алгоритмического языка. Важно понимать особенности и правила данного вида программирования для эффективной работы.
Правила построения фраз и смысловое значение предложений
— это правила построения фраз, позволяющие определить, правильно или неправильно написана та или иная фраза. Точнее говоря, синтаксис языка представляет собой набор правил, устанавливающих, какие комбинации символов являются осмысленными предложениями на этом языке.
определяет смысловое значение предложений языка. Являясь системой правил истолкования отдельных языковых конструкций, семантика устанавливает, какие последовательности действий описываются теми или иными фразами языка и, в конечном итоге, какой алгоритм определен данным текстом на алгоритмическом языке.
Алгоритмические языки: ключевые понятия
Каждое понятие алгоритмического языка подразумевает некоторую синтаксическую единицу (конструкцию) и определяемые ею свойства программных объектов или процесса обработки данных.
Основные понятия
Идентификаторы — употребляются для обозначения объектов программы (переменных, массивов, функций и др.).
Данные — величины, обрабатываемые программой. Три основных вида данных: константы, переменные и массивы.
Выражения — предназначены для выполнения необходимых вычислений, состоят из констант, переменных, указателей функций и операций.
Операторы — наиболее крупное и содержательное понятие языка. Каждый оператор определяет определенный этап обработки данных. Операторы могут быть исполняемыми и неисполняемыми.
Формат 32-битного целого числа со знаком
Побитовые операторы в JavaScript работают с 32-битными целыми числами в их двоичном представлении.
Числа представляются как 32-битное целое со знаком, старший бит слева и дополнение до двойки.
Это представление необходимо для битовых операций с числами.
Программный способ записи алгоритмов
При записи алгоритма в виде блок-схемы, на псевдокоде или в словесной форме, соблюдаются определенные правила представления команд. Точность записи алгоритма позволяет человеку понять суть и успешно выполнить его.
Понимание алгоритмов и языков программирования
Однако на практике в качестве исполнителей алгоритмов используются специальные автоматы — компьютеры. Поэтому алгоритм, предназначенный для исполнения на компьютере, должен быть записан на понятном ему языке. И здесь на первый план выдвигается необходимость точной записи команд, не оставляющей места для произвольного толкования их исполнителем.
Следовательно, язык для записи алгоритмов должен быть формализован. Такой язык принято называть языком программирования, а запись алгоритма на этом языке — программой для компьютера.
Пражнения
апись алгоритмов
Запишите по правилам алгоритмического языка выражения:
a) e)
б) ж)
в) з)
г) и)
д) к)
рифметические выражения
Запишите в обычной математической форме арифметические выражения:
а) a / b ** 2;
б) a + b / c + 1;
в) 1 / a * b / c;
г) a ** b ** c / 2;
д) (a ** b) ** c / 2;
е) a / b / c / d * p * q;
ж) x ** y ** z / a / b;
з) 4 / 3 * 3.14 * r ** 3;
и) b / sqrt(a * a + b);
к) d * c / 2 / R + a ** 3;
ычисление значений
Вычислите значения арифметических выражений при x = 1:
а) abs(x – 3) / ln(exp(3)) * 2 / lg(10000); Решение: abs(1 – 3) = 2; ln(exp(3)) = 3; lg(10000) = 4; 2 / 3 * 2 / 4 = 0.33;
б) среднее арифметическое и среднее геометрическое чисел a, b, c, d;
в) расстояние от точки с координатами (x, y) до точки (0, 0);
г) синус от x градусов;
д) площадь поверхности куба (длина ребра равна a);
е) радиус описанной сферы куба (длина ребра равна a);
ж) координаты точки пересечения двух прямых, заданных уравнениями a1x + b1y + c1 = 0 и a2x + b2y + c2 = 0;
начения логических выражений
огические выражения
адание формул
остроение графиков
пределение значений целочисленной переменной S
пределение значения переменной S
Markdown форматирование текста сделано на основе русскоязычного текста о программировании и алгоритмах.
7.15. Составьте алгоритмы решения задач линейной структуры (условия этих задач заимствованы из учебного пособия В.М. Заварыкина, В.Г. Житомирского и М.П. Лапчика "Основы информатики и вычислительной техники", 1989):
а) в треугольнике известны три стороны a, b и c; найти (в градусах) углы этого треугольника, используя формулы: Пояснение. Обратите внимание на то, что стандартные тригонометрические функции arccos и arcsin возвращают вычисленное значение в радианной мере. Решение:
б) в треугольнике известны две стороны a, b и угол C (в радианах) между ними; найти сторону c, углы A и B (в радианах) и площадь треугольника, используя формулы:
с2 = a2 + b2 – 2ab cos C. Пояснение.c
в) в треугольнике известны три стороны a, b и c; найти радиус описанной окружности и угол A (в градусах), используя формулы:
г) в правильной треугольной пирамиде известны сторона основания a и угол A (в градусах) наклона боковой грани к плоскости основания; найти объем и площадь полной поверхности пирамиды, используя формулы:
д) в усеченном конусе известны радиусы оснований R и r и угол A (в радианах) наклона образующей к поверхности большего основания; найти объем и площадь боковой поверхности конуса, используя формулы:
7.16. Составьте алгоритм решения задач развлетвляющейся структуры:
а) определить, является ли треугольник с заданными сторонами a, b, c равнобедренным; Решение:
б) определить количество положительных чисел среди заданных чисел a, b и c;
в) меньшее из двух заданных неравных чисел увеличить вдвое, а большее оставить без изменения;
г) числа a и b — катеты одного прямоугольного треугольника, а c и d — другого; определить, являются ли эти треугольники подобными;
д) даны три точки на плоскости; определить, какая из них ближе к началу координат;
е) определить, принадлежит ли заданная точка (x, y) плоской фигуре, являющейся кольцом с центром в начале координат, с внутренним радиусом r1 и внешним радиусом r2 ;
^ (Исключающее ИЛИ)
Выполняет операцию «Исключающее ИЛИ» над каждой парой бит.
a Исключающее ИЛИ b равно 1, если только a=1 или только b=1, но не оба одновременно a=b=1.
Таблица истинности для исключающего ИЛИ:
aba ^ b
Как видно, оно даёт 1, если ЛИБО слева 1, ЛИБО справа 1, но не одновременно. Поэтому его и называют «исключающее ИЛИ».
9 (по осн. 10) = 00000000000000000000000000001001 (по осн. 2) 14 (по осн. 10) = 00000000000000000000000000001110 (по осн. 2) ——————————– 14 ^ 9 (по осн. 10) = 00000000000000000000000000000111 (по осн. 2) = 7 (по осн. 10)
Исключающее ИЛИ в шифровании
Исключающее или можно использовать для шифрования, так как эта операция полностью обратима. Двойное применение исключающего ИЛИ с тем же аргументом даёт исходное число.
Иначе говоря, верна формула: a ^ b ^ b == a.
Пусть Вася хочет передать Пете секретную информацию data. Эта информация заранее превращена в число, например строка интерпретируется как последовательность кодов символов.
Вася и Петя заранее договариваются о числовом ключе шифрования key.
Например, пусть в data очередное число равно 9, а ключ key равен 1220461917.
Данные: 9 в двоичном виде 00000000000000000000000000001001 Ключ: 1220461917 в двоичном виде 01001000101111101100010101011101 Результат операции 9 ^ key: 01001000101111101100010101010100 Результат в 10-ной системе (шифровка): 1220461908
В нашем случае:
Полученная шифровка в двоичной системе: 9 ^ key = 1220461908 01001000101111101100010101010100 Ключ: 1220461917 в двоичном виде: 01001000101111101100010101011101 Результат операции 1220461917 ^ key: 00000000000000000000000000001001 Результат в 10-ной системе (исходное сообщение): 9
Конечно, такое шифрование поддаётся частотному анализу и другим методам дешифровки, поэтому современные алгоритмы используют операцию XOR ^ как одну из важных частей более сложной многоступенчатой схемы.
Акие у машинных языков достоинства и недостатки?
Каждый компьютер имеет свой машинный язык, то есть свою совокупность машинных команд, которая отличается количеством адресов в команде, назначением информации, задаваемой в адресах, набором операций, которые может выполнить машина и др.
При программировании на машинном языке программист может держать под своим контролем каждую команду и каждую ячейку памяти, использовать все возможности имеющихся машинных операций.
Но процесс написания программы на машинном языке очень трудоемкий и утомительный. Программа получается громоздкой, труднообозримой, ее трудно отлаживать, изменять и развивать.
Поэтому в случае, когда нужно иметь эффективную программу, в максимальной степени учитывающую специфику конкретного компьютера, вместо машинных языков используют близкие к ним машинно-ориентированные языки (ассемблеры).
Акими свойствами обладают алгоpитмы?
Основные свойства алгоритмов следующие:
1. Понятность для исполнителя — исполнитель алгоритма должен понимать, как его выполнять. Иными словами, имея алгоритм и произвольный вариант исходных данных, исполнитель должен знать, как надо действовать для выполнения этого алгоритма.
2. Дискpетность (прерывность, раздельность) — алгоpитм должен пpедставлять пpоцесс pешения задачи как последовательное выполнение пpостых (или pанее опpеделенных) шагов (этапов).
3. Опpеделенность — каждое пpавило алгоpитма должно быть четким, однозначным и не оставлять места для пpоизвола. Благодаpя этому свойству выполнение алгоpитма носит механический хаpактеp и не тpебует никаких дополнительных указаний или сведений о pешаемой задаче.
4. Pезультативность (или конечность) состоит в том, что за конечное число шагов алгоpитм либо должен пpиводить к pешению задачи, либо после конечного числа шагов останавливаться из-за невозможности получить решение с выдачей соответствующего сообщения, либо неограниченно продолжаться в течение времени, отведенного для исполнения алгоритма, с выдачей промежуточных результатов.
5. Массовость означает, что алгоpитм pешения задачи pазpабатывается в общем виде, т.е. он должен быть пpименим для некотоpого класса задач, pазличающихся лишь исходными данными. Пpи этом исходные данные могут выбиpаться из некотоpой области, котоpая называется областью пpименимости алгоpитма.
Ак записываются логические выражения?
Условие Запись на школьном алгоритмическом языке
Дробная часть вещественого числа a равна нулю int(a) = 0
Целое число a — четное mod(a, 2) = 0
Целое число a — нечетное mod(a, 2) = 1
Целое число k кратно семи mod(a, 7) = 0
Хотя бы одно из чисел a, b, c является отрицательным (a<0) или (b<0) или (c<0)
Целые числа a и b имеют одинаковую четность ((mod(a, 2)=0) и (mod(b, 2)=0) или ((mod(a, 2)=1) и (mod(b, 2)=1))
Точка с координатами (x, y) лежит в круге радиуса r с центром в точке (a, b) (x-a)**2 + (y-b)**2 < r*r
Уравнение ax^2 + bx + c = 0 не имеет действительных корней b*b – 4*a*c < 0
Целые числа a и b являются взаимнопротивоположными a = -b
Целые числа a и b являются взаимнообратными a*b = 1
Хотя бы одна из логических переменных F1 и F2 имеет значение да F1 или F2
Обе логические переменые F1 и F2 имеют значение да F1 и F2
Обе логические переменые F1 и F2 имеют значение нет не F1 и не F2
Логическая переменная F1 имеет значение да, а логическая переменная F2 имеет значение нет F1 и не F2
Только одна из логических переменных F1 и F2 имеет значение да (F1 и не F2) или (F2 и не F1)
Применение побитовых операторов
Побитовые операторы используются редко, но всё же используются.
Случаи применения побитовых операторов, которые мы здесь разберём, составляют большинство всех использований в JavaScript.
Например, в сравнении a == b^0 будет сначала выполнено сравнение a == b, а потом уже операция ^0, как будто стоят скобки (a == b)^0.
Обычно это не то, чего мы хотим. Чтобы гарантировать желаемый порядок, нужно ставить скобки: a == (b^0).
Маска
Для этого примера представим, что наш скрипт работает с пользователями.
У них могут быть различные роли в проекте:
Каждой роли соответствует ряд доступов к статьям и функциональности сайта.
Например, Гость может лишь просматривать статьи сайта, а Редактор – ещё и редактировать их, и тому подобное.
Что-то в таком духе:
Пользователь Просмотр статей Изменение статей Просмотр товаров Изменение товаров Управление правами
Если вместо «Да» поставить 1, а вместо «Нет» – 0, то каждый набор доступов описывается числом:
Пользователь Просмотр статей Изменение статей Просмотр товаров Изменение товаров Управление правами В 10-ной системе
Гость 1 0 1 0 0 = 20
Редактор 1 1 1 1 0 = 30
Админ 1 1 1 1 1 = 31
В последней колонке находится десятичное число, которое получится, если прочитать строку доступов в двоичном виде.
Например, доступ гостя 10100 = 20.
Такая интерпретация доступов позволяет «упаковать» много информации в одно число. Это экономит память, а кроме этого – это удобно, поскольку в дополнение к экономии – по такому значению очень легко проверить, имеет ли посетитель заданную комбинацию доступов!
Для этого посмотрим, как в 2-ной системе представляется каждый доступ в отдельности.
Доступ, соответствующий только управлению правами: 00001 (=1) (все нули кроме 1 на позиции, соответствующей этому доступу).
Доступ, соответствующий только изменению товаров: 00010 (=2).
Доступ, соответствующий только просмотру товаров: 00100 (=4).
Доступ, соответствующий только изменению статей: 01000 (=8).
Доступ, соответствующий только просмотру статей: 10000 (=16).
Доступ одновременно на просмотр и изменение статей – это двоичное число с 1 на соответствующих позициях, то есть access = 11000.
Как правило, доступы задаются в виде констант:
Теперь, чтобы понять, есть ли в доступе editor нужный доступ, например управление правами – достаточно применить к нему побитовый оператор И (&) с соответствующей константой.
Ненулевой результат будет означать, что доступ есть:
Такая проверка работает, потому что оператор И ставит 1 на те позиции результата, на которых в обоих операндах стоит 1.
Можно проверить один из нескольких доступов.
Например, проверим, есть ли права на просмотр ИЛИ изменение товаров. Соответствующие права задаются битом 1 на втором и третьем месте с конца, что даёт число 00110 (=6 в 10-ной системе).
Битовой маской называют как раз комбинацию двоичных значений (check в примере выше), которая используется для проверки и выборки единиц на нужных позициях.
Маски могут быть весьма удобны.
В частности, их используют в функциях, чтобы одним параметром передать несколько «флагов», т.е. однобитных значений.
Пример вызова функции с маской:
Это довольно-таки коротко и элегантно, но, вместе с тем, применение масок налагает определённые ограничения. В частности, побитовые операторы в JavaScript работают только с 32-битными числами, а значит, к примеру, 33 доступа уже в число не упакуешь. Да и работа с двоичной системой счисления – как ни крути, менее удобна, чем с десятичной или с обычными логическими значениями true/false.
Поэтому основная сфера применения масок – это быстрые вычисления, экономия памяти, низкоуровневые операции, связанные с рисованием из JavaScript (3d-графика), интеграция с некоторыми функциями ОС (для серверного JavaScript), и другие ситуации, когда уже существуют функции, требующие битовую маску.
Округление
Так как битовые операции отбрасывают десятичную часть, то их можно использовать для округления. Достаточно взять любую операцию, которая не меняет значение числа.
Например, двойное НЕ (~):
Подойдёт и Исключающее ИЛИ (^) с нулём:
alert( 12.345 ^ 0 ); // 12
Последнее даже более удобно, поскольку отлично читается:
alert(12.3 * 14.5 ^ 0); // (=178) "12.3 умножить на 14.5 и округлить"
У побитовых операторов достаточно низкий приоритет, он меньше чем у остальной арифметики:
alert( 1.1 + 1.2 ^ 0 ); // 2, сложение выполнится раньше округления
Проверка на −1
Внутренний формат 32-битных чисел устроен так, что для смены знака нужно все биты заменить на противоположные («обратить») и прибавить 1.
Обращение битов – это побитовое НЕ (~). То есть, при таком формате представления числа -n = ~n + 1. Или, если перенести единицу: ~n = -(n+1).
Как видно из последнего равенства, ~n == 0 только если n == -1. Поэтому можно легко проверить равенство n == -1:
Проверка на -1 пригождается, например, при поиске символа в строке. Вызов str.indexOf("подстрока") возвращает позицию подстроки в str, или -1 если не нашёл.
Умножение и деление на степени 2
Оператор a << b, сдвигая биты, по сути умножает a на 2 в степени b.
alert( 1 << 2 ); // 1*(2*2) = 4 alert( 1 << 3 ); // 1*(2*2*2) = 8 alert( 3 << 3 ); // 3*(2*2*2) = 24
При этом следует иметь в виду, что максимальный верхний порог такого умножения меньше, чем обычно, так как побитовый оператор манипулирует 32-битными целыми, в то время как обычные операторы работают с числами длиной 64 бита.
Какой форме записываются алгоритмы?
На практике наиболее распространены следующие формы представления алгоритмов:
Ак записываются алгоритмы на школьном алгоритмическом языке?
Часть алгоритма от слова алг до слова нач называется , а часть, заключенная между словами нач и кон — алгоритма.
В предложении алг после названия алгоритма в круглых скобках указываются характеристики (арг, рез) и тип значения (цел, вещ, сим, лит или лог) всех входных (аргументы) и выходных (результаты) переменных. При описании массивов (таблиц) используется служебное слово таб, дополненное граничными парами по каждому индексу элементов массива.
Примеры предложений алг:
Предложения дано и надо не обязательны. В них рекомендуется записывать утверждения, описывающие состояние среды исполнителя алгоритма, например:
Команды школьного АЯ
Служит для вычисления выражений и присваивания их значений переменным. Общий вид: А := В, где знак ":=" означает команду заменить прежнее значение переменной, стоящей в левой части, на вычисленное значение выражения, стоящего в правой части. Например, a := (b+c) * sin(Pi/4); i := i+1.
Команды ввода и вывода.
Команды если и выбор. Применяют для организации ветвлений.
Команды для и пока. Применяют для организации циклов.
Пример записи алгоритма на школьном АЯ
Производит операцию НЕ над каждым битом, заменяя его на обратный ему.
Таблица истинности для НЕ:
9 (по осн. 10) = 00000000000000000000000000001001 (по осн. 2) ——————————– ~9 (по осн. 10) = 11111111111111111111111111110110 (по осн. 2) = -10 (по осн. 10)
Из-за внутреннего представления отрицательных чисел получается так, что ~n == -(n+1).
alert( ~3 ); // -4 alert( ~-1 ); // 0
<< (Битовый сдвиг влево)
Операторы битового сдвига принимают два операнда. Первый – это число для сдвига, а второй – количество битов, которые нужно сдвинуть в первом операнде.
Оператор << сдвигает первый операнд на указанное число битов влево. Лишние биты отбрасываются, справа добавляются нулевые биты.
Например, 9 << 2 даст 36:
9 (по осн.10) = 00000000000000000000000000001001 (по осн.2) ——————————– 9 << 2 (по осн.10) = 00000000000000000000000000100100 (по осн.2) = 36 (по осн.10)
Операция << 2 сдвинула и отбросила два левых нулевых бита и добавила справа два новых нулевых.
Левый сдвиг почти равен умножению на 2
Битовый сдвиг << N обычно имеет тот же эффект, что и умножение на два N раз, например:
alert( 3 << 1 ); // 6, умножение на 2 alert( 3 << 2 ); // 12, умножение на 2 два раза alert( 3 << 3 ); // 24, умножение на 2 три раза
Конечно, следует иметь в виду, что побитовые операторы работают только с 32-битными числами, поэтому верхний порог такого «умножения» ограничен:
alert(10000000000 << 1); // -1474836480, отброшен крайний-левый бит alert(10000000000 * 2); // 20000000000, обычное умножение
>> (Правый битовый сдвиг, переносящий знак)
Этот оператор сдвигает биты вправо, отбрасывая лишние. При этом слева добавляется копия крайнего-левого бита.
Знак числа (представленный крайним-левым битом) при этом не меняется, так как новый крайний-левый бит имеет то же значение, что и в исходном числе.
Поэтому он назван «переносящим знак».
Правый сдвиг почти равен целочисленному делению на 2
>>> (Правый сдвиг с заполнением нулями)
Этот оператор сдвигает биты первого операнда вправо. Лишние биты справа отбрасываются. Слева добавляются нулевые биты.
Знаковый бит становится равным 0, поэтому результат всегда положителен.
| (Побитовое ИЛИ)
Основные преимущества таковы:
Таким образом, алгоритмические языки в значительной мере являются машинно-независимыми. Они облегчают работу программиста и повышают надежность создаваемых программ.
Список операторов
В следующей таблице перечислены все побитовые операторы. Далее операторы разобраны более подробно.
Побитовое И (AND) a & b Ставит 1 на бит результата, для которого соответствующие биты операндов равны 1.
Побитовое исключающее ИЛИ (XOR) a ^ b Ставит 1 на бит результата, для которого только один из соответствующих битов операндов равен 1 (но не оба).
Побитовое НЕ (NOT) ~a Заменяет каждый бит операнда на противоположный.
Левый сдвиг a << b Сдвигает двоичное представление a на b битов влево, добавляя справа нули.
Побитовые операторы работают следующим образом:
Посмотрим, как работают операторы, на примерах.
Вспомогательные функции parseInt, toString
Для удобной работы с примерами в этой статье, если вы захотите протестировать что-то в консоли, пригодятся две функции.
let access = parseInt("11000", 2); // получаем число из строки alert( access ); // 24, число с таким 2-ным представлением let access2 = access.toString(2); // обратно двоичную строку из числа alert( access2 ); // 11000
Без них перевод в двоичную систему и обратно был бы куда менее удобен. Более подробно они разбираются в главе Числа.