Другие языки программирования и технологии

Что делает оператор p = a[ N>>1 ]; в C++?

Оно сначала делает
N >> 1
это битовый сдвиг вправо на 1 бит. То есть если число N было равно, допустим,
100100011, то после сдвига вправо оно станет равно
010010001 - самый правый бит уходит в небытие, слева приписывается 0.
В результате, получается число, меньшее N в 2 раза, если N было чётное и (N - 1)/2, если N было нечётное.. .

Дальше происходит обращение к элементу массива
a[N >> 1]
a - это указатель (адрес памяти) на массив элементов какого-то типа (пусть будет тип Т)
(N >> 1) - какое-то целое число
Этой операцией оно:
1) берёт адрес памяти a,
2) прибавляет к этому адресу число (N>>1) * size(T), где size(T) - это размер типа T в байтах,
3) берёт значение типа Т по адресу (a + (N>>1) * size(T))
4) возвращает полученное значение типа Т

Дальше идёт оператор присваивания:
p = a[N >> 1];
Вот что происходит:
1) Получается значение выражения a[N >> 1] типа Т из предыдущего шага
2) Смотрится тип переменной p. Допустим у неё тип Т2.
3) Значение выражения a[N >> 1] типа Т преобразуется к типу Т2 переменной p.
4) Получается адрес переменной p
5) Программа переходит по адресу переменной p и записывает в память приведённое к типу Т2 значение выражения a[ N >> 1 ]
ВК
Владимир Кислица
1 895
Лучший ответ
То же, что p=a[N/2];
Исходный код выполняется быстрее - он выполняет вместо деления сдвиг двоичного представления числа вправо на один разряд..
то же что и p := a[N shr 1]; в Паскале.

> а что p := a[N shr 1]; выполняет в паскале?

А тебе не по барабану что он там выполняет, если ты не знаешь назначение оператора ">>" в Си ?)

Похожие вопросы