Bitweise Operatoren mit Ganzahlarithmethik nachbilden?



  • Angenommen ich hab hier eine Skriptsprache die kein bitwise XOR, Or AND und NOT bietet muss ausdrücke wie

    a = 3;
    b = 15;
    if ( a & b == 0)
     z = 1;
    else
     z = 0;
    

    durchführen.
    Wie kann ich das mit Ganzzahl-Arithmetik und +,-,*,/ nachbilden?
    Ich muss rausfinden ob es eine Schnittmenge an gesetzten Flags gibt.
    Der Gedanke für alle möglichen kombinationen eine IF-Orgie zu veranstalten vermisst mir gerade den Abend.

    Jemand eine Idee?

    Danke.



  • Den Modulo Operator gibt's auch nicht?



  • Nein, leider nicht.

    und sorry für die Tippfehler ( Groß/klein-Schreibung, fehlendes "und", es heißt natürlich "vermiest").



  • Na, Modulo kannst du ja recht einfach nachbilden. Daraus kannst du dann die anderen basteln. Kommt mir aber recht umständlich vor. Da gibt's vielleicht noch einfachere Varianten.



  • Bitwise schrieb:

    Angenommen ich hab hier eine Skriptsprache die kein bitwise XOR, Or AND und NOT bietet muss ausdrücke wie

    a = 3;
    b = 15;
    if ( a & b == 0)
     z = 1;
    else
     z = 0;
    

    durchführen.
    Wie kann ich das mit Ganzzahl-Arithmetik und +,-,*,/ nachbilden?

    lustiges problem.

    vielleicht mit

    //ungetestet, nur so reingehackt
    
    int mod(int a,int b){
       return a-a/b*b;
    }
    
    bool andReturnsTrue(int a,int b){
       if(a==0) return false;
       if(b==0) return false;
       if(mod(a,2)==mod(b,2)) return true;
       return andReturnsTrue(a/2,b/2);
    }
    
    a = 3;
    b = 15;
    if ( andReturnsTrue(a,b) == false)
     z = 1;
    else
     z = 0;
    


  • hmm ^^

    volkard schrieb:

    //ungetestet, nur so reingehackt
    
    int mod(int a,int b){
       return a-a/b*b; // gibt das nicht konstant 0 zurück?
                       // Thema Punkt vor strich
    }
    
    bool andReturnsTrue(int a,int b){
       if(a==0) return false;
       if(b==0) return false;
       if(mod(a,2)==mod(b,2)) return true;//wie gesagt da mod immer 0...
       return andReturnsTrue(a/2,b/2);
    }
    
    a = 3;
    b = 15;
    if ( andReturnsTrue(a,b) == false)
     z = 1;
    else
     z = 0;
    

    du hast glaub ich nen Denkfehler drin 🤡



  • ich würde das Problem in einer Schleife bitweise abarbeiten:

    int bit(int stelle,int wert)
    {
      int bitpos=1<<stelle;//wenn das nicht erlaubt ist: pow(2,stelle)
      return (wert/bitpos)%2;
    }
    
    int bitand(int left,int right)
    {
      int res=0;
      for(int p=0;p<INTSIZE;++p)
      {
        int bl=bit(left,p);
        int br=bit(right,p);
        res+=(bl*br)<<p;
      }
    }
    

    (bitor erreichst du mit 'max(bl,br)', bitxor mit '(bl+br)%2', bitnot mit '1-bl')



  • Taelan schrieb:

    du hast glaub ich nen Denkfehler drin 🤡

    nur unwichtige details wie if(a==0) return b!=0; hoffe ich.



  • volkard schrieb:

    Taelan schrieb:

    du hast glaub ich nen Denkfehler drin 🤡

    nur unwichtige details wie if(a==0) return b!=0; hoffe ich.

    Nein, es ging um bitweise Operatoren, nicht um logische 😉



  • CStoll schrieb:

    Nein, es ging um bitweise Operatoren, nicht um logische 😉

    Ach Neumodisches Zeug... 🙄


Anmelden zum Antworten