Гость |
Отправлено: 07.11.2004, 22:21 |
|
Не зарегистрирован
|
я новичок в програмирование ,
но мне нало срочно разораться
в следуещем
for(int i=0; i
{
int р = rand() % x;
InBuffer[(р>>3)+(i*size)] ^= 1<<(р&7);
}
а именно мне непонятны операции ">> " , "<<" , "&" , " %"
Пишите пожалуйста по подробнее |
|
Rius |
Отправлено: 08.11.2004, 00:38 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
Конструкция for приведена не полностью.
rand() — возвращает случайное число от 0 до константы RAND_MAX.
a=b%c — a равно остатку от деления b на c, если c= 10, то р = rand() % x будет от 0 до 9 (остаток от деления на 10).
>>, << — в данном случае операции побитового сдвига, например 00101110b << 2 = 10111000bb. Слева от знака стоит число, которое нужно сдвинуть, справа — на сколько бит сдвинуть. Стрелки указывают направление. После сдвига новые биты, не определенные до операции, заполняются нулями. Сдвиг влево — похож на умножение на 2, сдвиг вправо — на деление на два, но сдвиг и умножение — не одно и то же.
& — побитовое И (булева алгебра). p&7 означает, что в двоичном представлении числа p останутся только младшие три бита (ещё это называют "наложить маску"), все остальные обнулятся. Только для корректности желательно объявлять p как unsigned int, может даже unsigned char подойдет.
Запись InBuffer[(р>>3)+(i*size)] ^= 1<<(р&7) аналогична InBuffer[(р>>3)+(i*size)] = InBuffer[(р>>3)+(i*size)] ^ (1<<(р&7))
Похоже на обращение к двухмерному массиву как к одномерному.
i*size — строка, (p>>3) — столбец (p деленное на 8 без остатка).
|
|
Konstantine |
Отправлено: 08.11.2004, 12:03 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
неточность — QUOTE | р = rand() % x будет | не х, а с.
и ещё операция ^ — исключающее ИЛИ... — побитная операция, возвращает в разряде результата 0, если соотв. биты аргументов были одинаковыми, и 1 — если разые...
|
|
Гость |
Отправлено: 08.11.2004, 17:06 |
|
Не зарегистрирован
|
Спасибо вам за ответы
Тоесть получается что мы тут сравниваем
InBuffer[(р>> 3) + (i * size)] с (1<<(р&7))
если их значения одинаковы (биты аргументов одинаковы)
то значсение 0 ,если нет то 1. Я правильно понял. |
|
Guest |
Отправлено: 08.11.2004, 17:29 |
|
Не зарегистрирован
|
Нет.
Вы в ячейку массива InBuffer с номером [(р>>3)+(i*size)] записываете значение, получаемое как старое значение этой ячейки xor 1<<(р&7) (бит 1 сдвинутый влево на p разрядов (& 7 — ограничивает p диапазоном 0-7)) |
|
Konstantine |
Отправлено: 08.11.2004, 18:10 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
токо проследи чтоб за размеры буфера не уходил, т.к. size — это не его размер... (умножается на целое и ещё прибавляется шо-то)
|
|