C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите разобраться Пожалуйста(срочно), Помогите разобраться Пожалуйста(срочно)
Гость
Отправлено: 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 — это не его размер... (умножается на целое и ещё прибавляется шо-то)

Вернуться в Вопросы программирования в C++Builder