Оно сначала делает
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 ]
Другие языки программирования и технологии
Что делает оператор p = a[ N>>1 ]; в C++?
То же, что p=a[N/2];
Исходный код выполняется быстрее - он выполняет вместо деления сдвиг двоичного представления числа вправо на один разряд..
Исходный код выполняется быстрее - он выполняет вместо деления сдвиг двоичного представления числа вправо на один разряд..
то же что и p := a[N shr 1]; в Паскале.
> а что p := a[N shr 1]; выполняет в паскале?
А тебе не по барабану что он там выполняет, если ты не знаешь назначение оператора ">>" в Си ?)
> а что p := a[N shr 1]; выполняет в паскале?
А тебе не по барабану что он там выполняет, если ты не знаешь назначение оператора ">>" в Си ?)
Похожие вопросы
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
- Вычислить произведение n>=2 (n четное) сомножителей y=(2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7)*..
- Помогите составить блок схему. Данны целые числа n, k (n>=k>=0). Вычислить n(n-1)*(n-2)... (n-k-1)/k!
- СИ: "int a[3]={1, 2, 3}, * p=a+1" Чему равно значение выражения "p[0]-2"? И что вообще здесь происходит?
- Решите задачу! Дано целое число n найдите сумму 1^n +2^n-1 + 3^n-2 ...+n^1
- Как осуществить операцию сложения в с++ без операции присваивания ? int a=5; int b=6; int c=a+b; ( без "= ")
- Составьте программу, отыскивающую наибольший элемент массива A(N) из числа принадлежащим интервалу {min,(min+max\2))
- Особенности и недостатки в работе оператора cin>>
- Если в заданной матрице A(N, N) есть хотя бы один элемент, боль-ший ста, то элементы обеих диагоналей замените нулям
- Третий день ипусь над воздушным сопротивлением в Unity на C#. Кто силен? Помогите пожалуйста! (МНОГОБУКВ >>)