<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.205.249.5&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.205.249.5&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/109.205.249.5"/>
		<updated>2026-05-25T21:43:56Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=52544</id>
		<title>Побитовые операции</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8&amp;diff=52544"/>
				<updated>2016-03-08T08:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;109.205.249.5: /* Побитовые сдвиги */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Побитовые операции''' (англ. ''bitwise operations'') — операции, производимые над цепочками битов. Выделяют два типа побитовых операций: [[Определение булевой функции | логические операции]] и побитовые сдвиги.&lt;br /&gt;
==Принцип работы==&lt;br /&gt;
===Логические побитовые операции===&lt;br /&gt;
Битовые операторы И &amp;lt;tex&amp;gt;(AND,\ \&amp;amp;)&amp;lt;/tex&amp;gt;, ИЛИ &amp;lt;tex&amp;gt;(OR,\ \mid)&amp;lt;/tex&amp;gt;, НЕ &amp;lt;tex&amp;gt;(NOT,\ \sim)&amp;lt;/tex&amp;gt; и исключающее ИЛИ &amp;lt;tex&amp;gt;(XOR,\ $\textasciicircum$,\ \oplus)&amp;lt;/tex&amp;gt; используют те же таблицы истинности, что и их логические эквиваленты.&lt;br /&gt;
====Побитовое И====&lt;br /&gt;
Побитовое И используется для выключения битов. Любой бит, установленный в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, вызывает установку соответствующего бита результата также в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 !rowspan=2|&amp;amp;&lt;br /&gt;
 |-&lt;br /&gt;
 |11001010 &amp;lt;br&lt;br /&gt;
 /&amp;gt;11100010&lt;br /&gt;
 |-&lt;br /&gt;
 |||11000010&lt;br /&gt;
 |}&lt;br /&gt;
====Побитовое ИЛИ====&lt;br /&gt;
Побитовое ИЛИ используется для включения битов. Любой бит, установленный в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, вызывает установку соответствующего бита результата также в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 !rowspan=2| |&lt;br /&gt;
 |-&lt;br /&gt;
 |11001010 &amp;lt;br&lt;br /&gt;
 /&amp;gt;11100010&lt;br /&gt;
 |-&lt;br /&gt;
 |||11101010&lt;br /&gt;
 |}&lt;br /&gt;
====Побитовое НЕ====&lt;br /&gt;
Побитовое НЕ инвертирует состояние каждого бита исходной переменной.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 !rowspan=2| ~&lt;br /&gt;
 |-&lt;br /&gt;
 |11001010&lt;br /&gt;
 |-&lt;br /&gt;
 |||00110101&lt;br /&gt;
 |}&lt;br /&gt;
====Побитовое исключающее ИЛИ====&lt;br /&gt;
Исключающее ИЛИ устанавливает значение бита результата в &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, если значения в соответствующих битах исходных переменных различны.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 !rowspan=2| ^&lt;br /&gt;
 |-&lt;br /&gt;
 |11001010 &amp;lt;br&lt;br /&gt;
 /&amp;gt;11100010&lt;br /&gt;
 |-&lt;br /&gt;
 |||00101000&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Побитовые сдвиги===&lt;br /&gt;
Операторы сдвига &amp;lt;tex&amp;gt;\texttt{&amp;lt;&amp;lt;}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\texttt{&amp;gt;&amp;gt;}&amp;lt;/tex&amp;gt; сдвигают биты в переменной влево или вправо на указанное число. При этом на освободившиеся позиции устанавливаются нули (кроме сдвига вправо отрицательного числа, в этом случае на свободные позиции устанавливаются единицы, так как числа представляются в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код #Дополнительный код (дополнение до двух) | двоичном дополнительном коде]] и необходимо поддерживать знаковый бит).&lt;br /&gt;
&lt;br /&gt;
Сдвиг влево может применяться для умножения числа на два, сдвиг вправо — для деления.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 x = 7         &amp;lt;font color = green&amp;gt;// 00000111 (7)&amp;lt;/font&amp;gt;&lt;br /&gt;
 x = x &amp;gt;&amp;gt; 1    &amp;lt;font color = green&amp;gt;// 00000011 (3)&amp;lt;/font&amp;gt;&lt;br /&gt;
 x = x &amp;lt;&amp;lt; 1    &amp;lt;font color = green&amp;gt;// 00000110 (6)&amp;lt;/font&amp;gt;&lt;br /&gt;
 x = x &amp;lt;&amp;lt; 5    &amp;lt;font color = green&amp;gt;// 11000000 (-64)&amp;lt;/font&amp;gt;&lt;br /&gt;
 x = x &amp;gt;&amp;gt; 2    &amp;lt;font color = green&amp;gt;// 11110000 (-16)&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В языке программирования Java существует также оператор беззнакового битового сдвига вправо &amp;lt;tex&amp;gt;\texttt{&amp;gt;&amp;gt;&amp;gt;}&amp;lt;/tex&amp;gt;. При использовании этого оператора на освободившиеся позиции всегда устанавливаются нули.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 x = 7          &amp;lt;font color = green&amp;gt;// 00000111 (7)&amp;lt;/font&amp;gt;&lt;br /&gt;
 x = x &amp;lt;&amp;lt; 5     &amp;lt;font color = green&amp;gt;// 11100000 (-32)&amp;lt;/font&amp;gt;&lt;br /&gt;
 x = x &amp;gt;&amp;gt; 2    &amp;lt;font color = green&amp;gt;// 00111000 (56)&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
===Сложные операции===&lt;br /&gt;
====Проверка на то, является ли число степенью двойки====&lt;br /&gt;
Пусть дано число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Тогда, если результатом выражения &amp;lt;tex&amp;gt;(x\ \&amp;amp;\&amp;amp;\ !(x\ \&amp;amp;\ (x - 1)))&amp;lt;/tex&amp;gt; является единица, то число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; {{---}} степень двойки.&lt;br /&gt;
&lt;br /&gt;
====Определение знака числа====&lt;br /&gt;
Поскольку при сдвиге вправо на освобождающиеся позиции устанавливается бит знака, знак числа можно определить следующим образом:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;// в этом и следующих примерах в константе '''CHAR_BIT''' хранится количество битов в одном байте&amp;lt;/font&amp;gt;&lt;br /&gt;
 sign = x &amp;gt;&amp;gt; (''sizeof''('''int''') * '''CHAR_BIT''' - 1)    &amp;lt;font color = green&amp;gt;// если x &amp;lt; 0, результатом будет -1, иначе 0 &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sign = (x != 0) | (x &amp;gt;&amp;gt; (''sizeof''('''int''') * '''CHAR_BIT''' - 1))    &amp;lt;font color = green&amp;gt;// результатом будет -1, 0, или +1 &lt;br /&gt;
                                                          // для отрицательного, равного нулю и положительного числа x соответственно&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Используя побитовые операции можно также узнать, различны ли знаки двух переменных:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''bool''' result = ((x &amp;lt;tex&amp;gt;\oplus&amp;lt;/tex&amp;gt; y) &amp;lt; 0)    &amp;lt;font color = green&amp;gt;// значение переменной result == ''true'', если знаки переменных x и y различны&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Вычисление модуля числа без использования условного оператора====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mask = x &amp;gt;&amp;gt; ''sizeof''('''int''') * '''CHAR_BIT''' - 1&lt;br /&gt;
 &lt;br /&gt;
 abs = (x + mask) &amp;lt;tex&amp;gt;\oplus&amp;lt;/tex&amp;gt; mask&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;// другой способ сделать то же самое:&amp;lt;/font&amp;gt;&lt;br /&gt;
 abs = (x &amp;lt;tex&amp;gt;\oplus&amp;lt;/tex&amp;gt; mask) - mask&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Нахождение минимума и максимума из двух чисел без использования условного оператора====&lt;br /&gt;
Этот способ корректен только если можно утверждать, что величина &amp;lt;tex&amp;gt;(x - y)&amp;lt;/tex&amp;gt; лежит между граничными значениями типа int.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 min = y + ((x - y) &amp;amp; ((x - y) &amp;gt;&amp;gt; (''sizeof''('''int''') * '''CHAR_BIT''' - 1)))&lt;br /&gt;
 max = x - ((x - y) &amp;amp; ((x - y) &amp;gt;&amp;gt; (''sizeof''('''int''') * '''CHAR_BIT''' - 1)))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Применение для решения задач===&lt;br /&gt;
====Работа с битовыми масками====&lt;br /&gt;
Для работы с подмножествами удобно использовать битовые маски. Применяя побитовые операции легко сделать следующее: найти дополнение &amp;lt;tex&amp;gt;(\sim mask)&amp;lt;/tex&amp;gt;, пересечение &amp;lt;tex&amp;gt;(mask_1\ \&amp;amp;\ mask_2)&amp;lt;/tex&amp;gt;, объединение &amp;lt;tex&amp;gt;(mask_1 \mid mask_2)&amp;lt;/tex&amp;gt; множеств, установить бит по номеру &amp;lt;tex&amp;gt;(mask \mid (1\ \texttt{&amp;lt;&amp;lt;}\ x))&amp;lt;/tex&amp;gt;, снять бит по номеру &amp;lt;tex&amp;gt;(mask\ \&amp;amp;\ \sim(1\ \texttt{&amp;lt;&amp;lt;}\ x))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Битовые маски используются, например, при решении некоторых задач&amp;lt;ref&amp;gt;[[Гамильтоновы графы #Задача о коммивояжере| Динамическое программирование по подмножествам (по маскам)]]&amp;lt;/ref&amp;gt; [[Динамическое программирование | динамического программирования]].&lt;br /&gt;
&lt;br /&gt;
====Алгоритм Флойда====&lt;br /&gt;
{{main|Алгоритм Флойда}}&lt;br /&gt;
&lt;br /&gt;
====Дерево Фенвика====&lt;br /&gt;
{{main|Дерево Фенвика}}&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://www.c-cpp.ru/books/bitovye-operatory Онлайн справочник программиста на С и С++]&lt;br /&gt;
* [http://developer.alexanderklimov.ru/android/java/bitwise.php Побитовые операторы]&lt;br /&gt;
* [https://graphics.stanford.edu/~seander/bithacks.html Bit Twiddling Hacks by Sean Eron Anderson]&lt;/div&gt;</summary>
		<author><name>109.205.249.5</name></author>	</entry>

	</feed>