код

si4re
Offline
Зарегистрирован: 02.10.2014
void setbit(byte *data, byte n)
{
data[n/8]|=1<<(n%8);
}

помогите разобраться в коде

что значит символ *

вот этот момент тоже непонятен

data[n/8]|=1

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Читать: http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

Там есть ответы на оба вопроса и много чего ещё.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Этот код может установить бит в любом месте массива из 32 байт. Звёздочка означает указатель, а тип со звёздочкой - типизированный указатель. byte * - это указатель на байт в ОЗУ, т.е. переменная должна содержать указатель на байт в ОЗУ (адрес). Когда к переменной подставляют квадратную скобку - это означает взять элемент массива. Дело в том, что в языке C и C++ работа с массивами и указателями тесно связана. Можно обращаться к элементу массива используя указатель или квадратные скобки. n/8 в данном случае - целочисленное деление на 8, означает, что каждые восемь значений n будут относиться к одному элементу массива, то есть одному очередному байту. При целочисленном делении остаток отбрасывается. Значения n от 0 до 7 будут относиться к нулевому элементу байтового массива. % - это взятие остатка от целочисленного деления, по смыслу здесь это номер бита в байте. Операция |= это сокращённая запись x = x | y - побитовая операция сложения. 1 << x побитовый сдвиг влево на x разрядов.

Поскольку в байте всего 256 значений, а адресация к элементу массива идёт через 8, то этот код может установить бит в одном из 32 байт. Другими словами можно установить бит в массиве из 256 бит.