Задачка об оптимизации булевой функции COUNT(A,B,C,D)==1

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 11 июн 2008.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    В регистрах EAX, EBX, ECX, EDX находятся 4 булевых массива по 32 элемента в каждом. Необходимо арифметически сложить соответствующие элементы(то есть получить 32 суммы которые могут принимать значения от 0 до 4) и в регистр EAX записать в соответствующий разряд 1, если сумма равна 1 и 0 в противном случае(сумму в явном виде получить необязательно, главное проверить что она равна 1). Например:
    Код (Text):
    1. EAX=00011111h
    2. EBX=00111101h
    3. ECX=1F001100h
    4. EDX=03001001h
    5. Результат:
    6. EAX=1C100010h
    Оптимизируем как обычно по размеру.
     
  2. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
  3. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Бит результата установлен когда один и только один из операндов установлен.
    Для удобства обозначим a = ~A, b = ~B, c=~C, d=~D. Умножение - логическое И, сложение - логическое ИЛИ.

    R = Abcd + aBcd + abCd + abcD
    R = (Ab+aB)cd + ab(Cd+cD)
    Как известно, Ab+aB эквивалентно A xor B.
    R = (A xor B)cd + (C xor D)ab

    cd = ~C*~D = ~(C+D)


    R = (A^B)&~(C|D) | (C^D)&~(A|B)

    Получаем что-то вроде:
    Код (Text):
    1. mov esi, eax
    2. mov edi, ecx
    3. or esi, ebx ; A|B
    4. or edi, edx ; C|D
    5. xor eax, ebx ; A^B
    6. xor ecx, edx ; C^D
    7. not esi
    8. and ecx, esi
    9. not edi
    10. and eax, edi
    11. or eax, ecx
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Код (Text):
    1. ;R = (A^B^C^D)&((A|B)^(C|D))
    2. xor eax,ebx
    3. or ebx,eax
    4. xor eax,ecx
    5. or ecx,edx
    6. xor eax,edx
    7. xor ebx,ecx
    8. and eax,ebx
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    reverser
    У меня было R = ~( (~(A^B)|C|D) & (A|B|~(C^D)) ), но по длине тоже самое:
    Код (Text):
    1.     mov esi,eax
    2.     xor eax,ebx
    3.     not eax
    4.     or eax,ecx
    5.     or eax,edx
    6.     xor edx,ecx
    7.     not edx
    8.     or edx,ebx
    9.     or edx,esi
    10.     and eax,edx
    11.     not eax
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    leo
    После такого гениального решения я даже не знаю, стоит ли мне сочинять задачки для которых не могу решения нормального придумать :)

    Думаю можно еще пооптимизировать вычисление:
    COUNT(A,B,C,D)==2
    COUNT(A,B,C,D)==3

    Еще интересная задачка:
    A=(COUNT(A,B,C)==2) при условии что дополнительной памяти использовать нельзя, то есть можно выполнять только операции:
    XOR A,B / XOR A,C / XOR B,A / XOR B,C / XOR C,A / XOR C,B
    AND A,B / AND A,C / AND B,A / AND B,C / AND C,A / AND C,B
    OR A,B / OR A,C / OR B,A / OR B,C / OR C,A / OR C,B
    NOT A / NOT B / NOT C
    Решается вроде за 5 команд, но как я пока не знаю.
     
  7. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    (COUNT(A,B,C)==2)

    Код (Text):
    1. XOR A,B
    2. XOR A,C
    3. OR   B,C
    4. NOT A
    5. AND A,B
     
  8. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    COUNT(A,B,C,D)==2
    пока везде продолжаю мысли leo =)

    Код (Text):
    1. ; r=((a^b)|(b^c))&~(a^b^c^d);
    2.  
    3. XOR A,B
    4. XOR B,C
    5. XOR D,A
    6. XOR D,C
    7. OR   A,B
    8. NOT D
    9. AND A,D
     
  9. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Сочиняй больше=) Можешь ешё на машине Тьюринга толкать. Тоже забава неплохая =)
     
  10. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Proteus
    У меня для COUNT(A,B,C)==2 немного другое решение:
    Код (Text):
    1. XOR A,B
    2. XOR A,C
    3. OR B,A
    4. OR B,C
    5. XOR A,B