В общем думаю так: 1) Делаем циклический сдвиг на 4 бита, ксорим, запоминаем результат во временном регистре. 2) Повторяем пункт 1 семь раз, каждый раз сдвигая дальше и дальше, и на каждой итерации применяя логическое "и" к временному регистру и текущему результату. 3) Применяем операцию "и" ко всем тетрадам временного регистра. 4) Ну и напоследок переводим число в -1. Итого если хотя-бы один раз в одной тетраде получился 0, то результат будет тоже 0.
Booster Я честно говоря совсем не понял где у вас логическое И, а где ИЛИ, поэтому очень хотелось бы увидеть код. persicum Весьма перспективная идея, может стать абсолютным чемпионом, после некоторого улучшения. всем Уже целая страница идей и ни одного рабочего исходника, удивительно...
Это что, издевка такая? Решение ведь самое простое и тривиальное, заводишь словарь на 16 входов и усе... Можно отхапать из стека 16 байт типа mov ebp,esp add esp,16 А можно делать битовые зарубки на другом регистре, предварительно очищенном. Мда, всего то нужен словать на 16 бит.
persicum Действительно хорошее решение, любители сдвигать и ксорить тут полностью пролетают. Для них придётся задачку модифицировать. Модифицированная версия задачки: 1) в rax лежит 8 байт, нужно записать в rax 0, если хотя бы да из них совпадают, и FFFFFFFF_FFFFFFFF если все байты различны. 2) то же самое, вместо rax используется mm0.
Booster там xor ebx,ebx xor ecx,ecx а потом 8 блоков вида bts bx,ax adc ecx,0 rol eax,4 ну а дальше что-то вроде cmp ecx,0 sbb eax,eax not eax
Booster если 8 блоков подряд и каждый кончается jz @quit такое не покатит? Типа ror 4 and eax,15 dec byteptr [ebp-eax] jz @quit массив инициализируется двойками
Ну, пусть буду первым (FASM, 85 байт): Код (Text): xor edx, edx xor ecx, ecx xor ebx, ebx xor edi, edi xor ebp, ebp push eax mov esi, esp rept 4 { lodsb aam 16 mov cl, al mov dl, ah bts ebx, ecx sbb edi, ebp bts ebx, edx sbb edi, ebp } neg edi sbb eax, eax
83 байта Код (Text): xor ecx, ecx xor ebx, ebx xor edx, edx xor edi, edi push eax mov esi, esp rept 4 { lodsb aam 16 mov cl, al bts ebx, ecx sbb edx, edi mov cl, ah bts ebx, ecx sbb edx, edi } neg edx sbb eax, eax
KeSqueer Но это же не проблема? not eax в конце и +2(?) байта. Пусть код и довольно большой, но надо же с чего-то начинать? Выкладываем решения размером меньше!
не лучшее решение Код (Text): mov eax,0ABCDEF0h xor ebp,ebp xor ecx,ecx mov ebx,eax rept 7 ror ebx,4 mov edx,ebx xor edx,eax mov esi,edx and esi,0Fh setz cl or ebp,ecx mov esi,edx and esi,0F0h setz cl or ebp,ecx mov esi,edx and esi,0F00h setz cl or ebp,ecx mov esi,edx and esi,0F000h setz cl or ebp,ecx mov esi,edx and esi,0F0000h setz cl or ebp,ecx mov esi,edx and esi,0F00000h setz cl or ebp,ecx mov esi,edx and esi,0F000000h setz cl or ebp,ecx mov esi,edx and esi,0F0000000h setz cl or ebp,ecx endm dec ebp mov eax,ebp
чуть-чуть подумав Код (Text): mov eax,0ABCDEF0h xor ebp,ebp xor ecx,ecx mov ebx,eax rept 7 ror ebx,4 mov edx,ebx xor edx,eax test edx,0Fh setz cl or ebp,ecx test edx,0F0h setz cl or ebp,ecx test edx,0F00h setz cl or ebp,ecx test edx,0F000h setz cl or ebp,ecx test edx,0F0000h setz cl or ebp,ecx test edx,0F00000h setz cl or ebp,ecx test edx,0F000000h setz cl or ebp,ecx test edx,0F0000000h setz cl or ebp,ecx endm dec ebp mov eax,ebp