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...