Bitwise Operator "and &"



  • Hallo,
    //erstmal eine ganz kurze Vorstellung:
    Ich bin neu hier im Forum und auch was das Programmieren angeht bin ich noch eine Anfaengerin.//

    Heute sollten wir einen Programm schreiben, der zwei Zahlen addiert und multipliziert aber nicht mit den ueblichen Rechenzeichen sondern mit den Bitwise operators "or |" und "and &".

    Mein Code sah so aus:

    int x=5;
    int y=2;
    printf("%d\n", x|y);
    printf("%d", x&y);

    Was den Oparator "or" angeht, da gab es keine Probleme, das Ergebnis war 7, was ich auch erwartet hatte.
    Das zweite Ergebnis sollte eigentlich 10 sein (5*2=10), was aber nicht der Fall war, es kam naemlich 0 raus.

    meine Fragen:
    Warum war das Ergebnis 0 und nicht 10?
    Wie muesste der Code lauten, damit auch 10 rauskommt?

    Ich habe stundenlang gegoogelt, konnte aber leider nichts hilfreiches ueber dieses Thema finden. Ich waere sehr dankbar wenn ihr mir bei meinem Problem weiterhelfen koenntet.



  • Yu_Jain schrieb:

    Das zweite Ergebnis sollte eigentlich 10 sein (5*2=10), was aber nicht der Fall war, es kam naemlich 0 raus.

    meine Fragen:
    Warum war das Ergebnis 0 und nicht 10?

    Weil 5=010125 = 0101_2 und 2=001022 = 0010_2 keine gemeinsamen Bits haben.

    Wie muesste der Code lauten, damit auch 10 rauskommt?

    Wenn Du * willst, schreib auch *:

    printf("%d", x*y);
    


  • Yu_Jain schrieb:

    Heute sollten wir einen Programm schreiben, der zwei Zahlen addiert und multipliziert aber nicht mit den ueblichen Rechenzeichen sondern mit den Bitwise operators "or |" und "and &".

    Das ist ziemlich kompliziert. Wenn du erwartest, dass du da einfach sowas wie x|y hinschreiben kannst, bist du ziemlich auf dem Holzweg.

    Hast du Grundkenntnisse in technischer Informatik, weißt du was ein Halbaddierer ist, wie ein Addierwerk funktioniert? Das musst du im Grunde nachbauen.

    Ohne das wird es ziemlich schwierig.



  • Wenn Du * willst, schreib auch :
    Code:
    printf("%d", x
    y);

    Diese Moeglichkeit kenne ich schon, aber ich moechte den Operator "and" benutzen.

    Hast du Grundkenntnisse in technischer Informatik, weißt du was ein Halbaddierer ist, wie ein Addierwerk funktioniert? Das musst du im Grunde nachbauen.

    Nein, leider nicht. Ich weiss weder was Halbaddierer und ein Addierwerk sind noch wie die funktionieren.

    Ich moechte aber unbedingt wissen wie dieser Code geschrieben wird. Ich weiss, dass ich nicht erwarten kann, dass mir jemand den ganzen Code aufschreibt,aber kannn mir vielleicht jemand sagen was fuer Functions ich dafuer brauche oder eine grobe Erklaerung geben?
    Das waere wirklich sehr nett.


  • Mod

    Yu_Jain schrieb:

    Nein, leider nicht. Ich weiss weder was Halbaddierer und ein Addierwerk sind noch wie die funktionieren.

    Ich moechte aber unbedingt wissen wie dieser Code geschrieben wird. Ich weiss, dass ich nicht erwarten kann, dass mir jemand den ganzen Code aufschreibt,aber kannn mir vielleicht jemand sagen was fuer Functions ich dafuer brauche oder eine grobe Erklaerung geben?
    Das waere wirklich sehr nett.

    Die Stichworte wurden dir doch gegeben. Ich merke, du hast sie nicht gegoogelt. 🙄

    Es gibt in C selbstverständlich keine vorgefertigte Funktion

    int extra_umständliche_multiplikation_die_intern_nur_bitoperationen_nutzt(int a, int b);
    

    Das musst du dir schon selber schreiben, wenn du es willst. Wie das im Groben geht, bekommst du mit den obigen Stichwörtern heraus. Oder du bekommst wenigstens das nötige Grundwissen, mit dem du vielleicht eine grobe Erklärung verstehen könntest.



  • Nein, leider nicht. Ich weiss weder was Halbaddierer und ein Addierwerk sind noch wie die funktionieren.

    wie sollst du dann die Aufgabe lösen können?
    Warum denkt der Aufgabensteller du könntest sowas - oder solltest es können?

    Ich moechte aber unbedingt wissen wie dieser Code geschrieben wird.
    Ich weiss, dass ich nicht erwarten kann, dass mir jemand den ganzen Code aufschreibt,aber kannn mir vielleicht jemand sagen was fuer Functions ich dafuer brauche oder eine grobe Erklaerung geben?

    ausser |, & und if/for gibt es da keine anderen Funktionen die du nutzen kannst - falls du WIRKLICH eine Multiplikation auf Bitebene durchführen sollst (was kaum jemand auf der Welt machen muss - maximal wenn dein Rechner kein Rechenwerk hat (sehr sehr sehr selten) - oder du einfach verstehen sollst wie es funktioniert - damit du selbst mal solche (Hardware)Rechenwerke entwickeln kannst)

    google ist dein Freund:

    "multiply with bitwise operator"
    "multiply with bit shift"

    und,und,und...



  • int add(int a, int b) {
    	int carry;
    
    	while(b != 0) {
    		carry = a & b;  
    		a = a ^ b; 
    		b = carry << 1;
    	}
    
    	return a;
    }
    
    int multiply(int a, int b) {
    	int result;
    
    	result = 0;
    
    	while(b != 0 ) {
    		if(b & 1) {
    			result = add(result, a);
            }
    
    		a <<= 1;
    		b >>= 1;
    	}
    
        return result;
    }
    


  • Das Problem hat sich geloest, ich weiss jetzt wie der Code geht.



  • ich weiß nicht, ob du überhaupt das Problem verstanden hast. Weiß du, was der Unterschied zwischen der Multiplikation und Bitweise-UND Operation ist?

    Ist dir klar, dass

    int x=5; 
    int y=2; 
    printf("%d\n", x|y);
    

    hier rein zufällig x|y und x+y gleich sind? Schon mal

    int x=1; 
    int y=1; 
    printf("%d\n", x|y);
    

    ausgeführt? Was denkst du, was dabei rauskommt? 2?



  • supertux schrieb:

    ich weiß nicht, ob du überhaupt das Problem verstanden hast.

    Das ist doch irrelevant. Das Problem (= er hat keinen Code, den er für seine Hausaufgabe abgeben kann) ist doch gelöst.



  • supertux schrieb:

    ich weiß nicht, ob du überhaupt das Problem verstanden hast. Weiß du, was der Unterschied zwischen der Multiplikation und Bitweise-UND Operation ist?

    Anfangs dachte ich dass "& und |" operator das selbe sind wie "*,/" aber nach meiner google suche hab ich es verstanden.
    Auch dass mein Code den ich geschrieben hatte richtig war und x&y gar nicht 10 rauskommen kann, ausser wenn man es dann ganz anders schreibt.

    Bei deinem Beispiel wuerde dann 1 rauskommen.

    SG1 schrieb:

    Das ist doch irrelevant. Das Problem (= er hat keinen Code, den er für seine Hausaufgabe abgeben kann) ist doch gelöst.

    Also erstmal bin ich weiblich und zweitens musst du nicht gleich beleidigend werden bloss weil dir meine Frage nicht gefallen hat.
    Uebrigens ist das keine Hausaufgabe, die Aufgabe war ein Programm zu schreiben und dabei diese zwei Operator zu benutzen, aber ich habs falsch verstanden(wie es genau dazu gekommen ist muss ich ja wohl nicht sagen, wird sonst ein viel zu langer Text), das ist mir aber erst aufgefallen, nachdem ich die Frage gestellt hatte. Dann wollte ich es einfach aus Interesse aus wissen.
    An meiner Note wird sich ueberhaubt nichts aendern ob ich nun den Code hab oder nicht.


Anmelden zum Antworten