Ein bisschen boole Magie


20

Herausforderung

Mit der folgenden C # -Methode:

private static bool Test(bool a, bool b)
{
    if (a && b) return false;
    if (a) if (b) return true;
    return false;
}

Liefern Sie die Werte aund bdamit truewird zurückgegeben.

Gewinnbedingung

Der erste Eintrag, der die richtigen Argumente angeben kann, damit die angegebene Methode als trueSieger gewertet wird .


4
Willkommen bei PPCG! Für alle Herausforderungen ist ein objektives Gewinnkriterium erforderlich, sodass bei mehreren Einsendungen ein Gewinner ausgewählt werden kann. Es scheint, als gäbe es hier nur eine einzige Lösung, daher ist diese Herausforderung möglicherweise nicht für PPCG geeignet. Für zukünftige Herausforderungen empfehle ich die Sandbox, in der Sie Feedback erhalten können, bevor die Herausforderung live geht.
Martin Ender

2
Die Metadiskussion ist gespalten darüber, ob Programmierpuzzles ohne zusätzliche Gewinnkriterien zum Thema gehören , wobei widersprüchliche Antworten zur Sprache kommen. Ich möchte die Fragen lieber offen halten, wenn sie nicht geklärt sind, daher stimme ich für eine Wiedereröffnung. Wenn Sie Meinungen haben, bringen Sie diese bitte in die Diskussion ein.
xnor

2
@DenkerAffe Ich glaube nicht, dass eine der vier offensichtlichen Parameterkombinationen funktioniert.
Martin Ender

3
Vorausgesetzt, es gibt eine gültige Antwort, ist dies eine ausgezeichnete Frage, unabhängig davon, ob sie zu dem passt, was wir normalerweise zum Thema betrachten. + 1. Ich denke, einer der Gründe, warum wir Fragen wie diese normalerweise nicht in Betracht ziehen, ist, dass jede andere Frage, die ich so gesehen habe, von einem Anfänger stammt und die Antwort blendend offensichtlich war.
Level River St

5
@Widi Sehen Sie, deshalb ist "erste gültige Lösung" möglicherweise nicht die beste Idee. Möglicherweise erhalten Sie eine uninteressante, aber funktionierende Lösung, die nur durch Reflektion mit einigen internen Elementen in Konflikt gerät, und dann besteht für niemanden der Anreiz, nach einer interessanteren Lösung ohne Reflektion zu suchen.
Martin Ender

Antworten:


20
static void Main(string[] args)
{
    bool a, b;
    unsafe
    {
        int* pa = (int*)&a;
        int* pb = (int*)&b;
        *pa = 1;
        *pb = 2;
    }

        Console.Write(Test(a, b));
}

Dies wird Truefür mich mit der C # -Implementierung gedruckt , die mit Visual Studio 2015 geliefert wird. Eigentlich kenne ich kein C #, aber ich dachte, ich würde versuchen, etwas C-Code zu schreiben und zu sehen, ob es funktioniert. Ich hatte gehofft, der Compiler würde annehmen, dass True immer als 1 dargestellt wird und ein bitweises UND verwenden. Im Debug-Modus ist dies tatsächlich der Fall (es hat auch mit Release funktioniert). Es wird ein bitweises UND für die erste Bedingung und zwei Vergleiche mit Null für die zweite Bedingung verwendet:

            if (a && b) return false;
002C2E92  movzx       eax,byte ptr [ebp-3Ch]  
002C2E96  movzx       edx,byte ptr [ebp-40h]  
002C2E9A  and         eax,edx  
002C2E9C  and         eax,0FFh  
002C2EA1  mov         dword ptr [ebp-44h],eax  
002C2EA4  cmp         dword ptr [ebp-44h],0  
002C2EA8  je          002C2EB2  
002C2EAA  xor         edx,edx  
002C2EAC  mov         dword ptr [ebp-48h],edx  
002C2EAF  nop  
002C2EB0  jmp         002C2EE4  
            if (a) if (b) return true;
002C2EB2  movzx       eax,byte ptr [ebp-3Ch]  
002C2EB6  mov         dword ptr [ebp-4Ch],eax  
002C2EB9  cmp         dword ptr [ebp-4Ch],0  
002C2EBD  je          002C2EDC  
002C2EBF  movzx       eax,byte ptr [ebp-40h]  
002C2EC3  mov         dword ptr [ebp-50h],eax  
002C2EC6  cmp         dword ptr [ebp-50h],0  
002C2ECA  je          002C2EDC  
002C2ECC  mov         eax,1  
002C2ED1  and         eax,0FFh  
002C2ED6  mov         dword ptr [ebp-48h],eax  
002C2ED9  nop  
002C2EDA  jmp         002C2EE4  
            return false;
002C2EDC  xor         edx,edx  
002C2EDE  mov         dword ptr [ebp-48h],edx  
002C2EE1  nop  
002C2EE2  jmp         002C2EE4  
        }
002C2EE4  mov         eax,dword ptr [ebp-48h]  
002C2EE7  lea         esp,[ebp-0Ch]  
002C2EEA  pop         ebx  
002C2EEB  pop         esi  
002C2EEC  pop         edi  
002C2EED  pop         ebp  
002C2EEE  ret  

Tolle! Ich war mir absolut sicher, dass dies nicht möglich war
edc65

Ich habe das Gleiche versucht, aber es scheint in Mono unter Linux nicht zu funktionieren.
Jimmy23013

Dies wäre nicht vom C # -Compiler (derzeit Roslyn von MS) abhängig, sondern vom JIT-Compiler (derzeit RyuJIT von MS). Die vom C # -Compiler erzeugte IL kann sich jedoch auch auf die JIT auswirken.
Bob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.