Что означает запись >> или << в коде

351
04 июня 2017, 20:39

К примеру есть участки кода, подобные этим:

d[1 << i][i] = 1;
if (!((mask >> j) & 1) && g[i][j])
    d[mask ^ (1 << j)][j] += d[mask][i];

Что означают вот эти знаки >>, <<, ^, & ?

И где можно почитать литературу про подобное?

И как это применяется в олимпиадных задачах?

Answer 1

где почитать:

в абсолютно любой книге по с/с++ в первых главах, где описываются арифметические и логические операции. >> называется "оператор сдвига влево". << называется "оператор сдвига вправо". ^ называется "исключающее или". Если в книге этого нет, выкидывайте такую книгу.

где применяется

Операторы сдвига применяют в "олимпиадных задачах" для быстрого умножения/деления на степени двойки (и не только). Но современные компиляторы часто сами могут это сделать не хуже.

А еще операторы сдвига в С++ являются перегруженными операторами для некоторых классов. Например для cout и cin и позволяют делать ввод-вывод более "человечным".

К примеру конструкция 1 << i очень популярна, если нужно получать степени двойки (очень быстро). 1 << 2 = 4 = 2 в степени 2, 1 << n = 2 в степени n.

Answer 2

Попробую объяснить немного неформально, что означает << и >>. Например у нас есть такой код:

#include <stdio.h>
main ()
{
  char a = 5 << 2;
  printf("%d\n", a);
}

У нас есть число 5 в десятичной системе счисления. Если его перевести в двоичную, будет: 0000 0101. Теперь берём и "сдвигаем" это двоичное представление влево на 2 позиции, добавляя справа нули: 0001 0100. А теперь переведём обратно получившееся двоичное число в десятичную систему счисления: 20. Если скомпилировать данный код и запустить, будет выведено: 20. Аналогично и для операции >>, только сдвиг вправо.

Answer 3

Это бинарные операторы.

<< >> - Операторы сдвига.

& - Побитовое "И"

| - Побитовое "ИЛИ"

^ - Исключающее "ИЛИ"

~ - Оператор дополнения.

Подробнее об бинарных операторах и операциях можно почитать тут: Habrahabr.ru - Очень доступно описано.

READ ALSO
Set, Multiset, Map, Multimap

Set, Multiset, Map, Multimap

В чем разница между ними и примеры, если можно

324
Точка входа в процедуру CancelIoEx не найдена в библиотеке DLL KERNEL32.dll. (Qt)

Точка входа в процедуру CancelIoEx не найдена в библиотеке DLL KERNEL32.dll. (Qt)

Не запускается релизная версия программы сервиса написанная на Qt на Windows xp Service pack 3Windows установлена на Virtual box остальные программы там запускаяются,...

1387
Получить value с input jquery

Получить value с input jquery

Доброго дня! есть следующего вида механизм вывода списка из базы:

492
jquery ui resizible как убрать стрелки для ресайза

jquery ui resizible как убрать стрелки для ресайза

Как убрать стрелки ресайза с правой и нижней стороны блокаЧтобы стрелка для ресайза появлялась и работала только по ярлычку в правом нижнем...

260