Здравствуйте. Наставьте на путь истинный, пожалуйста. В обработчике WM_LBUTTONUP помещаю в AX координату курсора Y (из lParam). Далее нужно содержимое AX разделить на 32, и полученное целое умножить на 4. Поскольку от остатка нужно избавиться, то вариант только сдвинуть всё вправо на три бита не годится, остаются установленными ненужные биты. Вот хотел спросить как бы это лучше организовать? Сдвинуть сначала на пять бит вправо, а потом на два влево, или сдвинуть сразу на три вправо, а после/до этого обнулить ненужные биты эндом? Как будет грамотрнее/быстрее, и кого лучше двигать/эндить AX (а потом CWDE) или EAX (очистив его перед копированием координаты в AX), если конечный результат должен быть в EAX? Или же я вообще чушь пишу и есть лучший способ? И вот ещё что. Мне кажется или я действительно где-то встречал быстрые способы нахождения остатка от деления числа на двойку в степени? Что-то никак не вспомню где...
Ну во-первых, обработчик WM_LBUTTONUP это не место для мелочной оптимизации Если же говорить в общем, то для большинства процев сдвиги выполняются также быстро, как и логические операции. Исключением являются только первые 2 модели P4 (Willamette и Northwood), в которых shl\shr выполняются за 4 такта (на MMX_ALU), а логика за 0.5-1 такта, поэтому для них вариант shr+and будет выполняться быстрее. Что касается AX\EAX, то лучше всего сразу грузить операнд в EAX: movzx eax,word [X] Остаток от деления на степень двойки получается простым AND. Если задано само число, например 16, то просто and eax,16-1. Если же задана степень, в данном сл. 4, то нужно сформировать маску для and - сдвинуть единицу вверх на 4 и вычесть 1
Огромное спасибо, всё усвоил. Само собой, но зато, когда найду для неё место, одним вопросом уже будет меньше =)