2 Zahlen auf Stellengleichheit prüfen, binär zurückgeben?



  • Hallo,

    habe folgendes Anliegen: Eine Integerzahl '12345' soll mit einer weiteren Intergerzahl '35' verglichen werden. Als Ausgabe möchte ich '00101'. Dh die Einsen repräsentieren die übereinstimmenden Stellen.

    Weiß jemand wie ich das in Ansi C löse?

    Danke und Gruß



  • #include <limits.h>
     void bin_gucki_guck ( unsigned num )
     {
    	unsigned l = 1<<sizeof(num)*CHAR_BIT-1;
    	while (l)
    	{
    		l&num?printf("1"):printf("0");
    		l>>=1;
    	}
     }
    


  • Na so ganz werd ich daraus jetzt nicht schlau 😕.

    Die Funktion wandelt mir die Zahl 'num' ins Binärsystem.
    Aber wie soll ich denn durch Vergleich zweier Binärzahlen darauf schließen, an welcher Stelle sich die Dezimalzahlen gleich sind?



  • Wenn du bitweise gleichheit der einzelnen Bits in der Ausgabe durch eine 1 markiert haben möchtest, dann mach das so:

    ~(num1 ^ num2)
    

    Der Xor liefert genau dann 0 wenn beide verglichenden bits entweder beide 0 oder 1 sind. Sind sie unterschieldich dann 1. Somit mußt du nun noch alle bits umdrehen und das macht ~.

    Beispiel:

    Zahl 1: 0101 0001 0101 1110
    Zahl 2: 1011 1010 1101 0011
    ----------------------------
    xor:    1110 1011 1000 1101
    ----------------------------
    compl:  0001 0100 0111 0010
    

    Und das ist das was du willst, wenn ich dich richtig verstanden habe.



  • Kody schrieb:

    Na so ganz werd ich daraus jetzt nicht schlau 😕.

    Die Funktion wandelt mir die Zahl 'num' ins Binärsystem.
    Aber wie soll ich denn durch Vergleich zweier Binärzahlen darauf schließen, an welcher Stelle sich die Dezimalzahlen gleich sind?

    axoh. sry, flasch veschanden.
    dachte das wär wieder sone standard frage.

    in etwa so, ungetestet:

    void gucki_guck2(int ia, int ib )
    {
    	char ca[64]={0}, cb[64]={0};
    	char* pa=ca,*pb=cb;
    	int la,lb;
    
    	itoa(ia,ca,10);
    	itoa(ib,cb,10);
    
    	la = strlen(ca);
    	lb = strlen(cb);
    
    	if ( la<lb )
    		pb += strlen(cb)-strlen(ca);
    	if ( la>lb )
    		pa += strlen(ca)-strlen(cb);
    
    	while (*pa)
    	{
    		if ( *pa==*pb )
    			printf("1");
    		else
    			printf("0");
    		pa++;
    		pb++;
    	}
    
    }
    


  • Danke für eure Hilfe. Waren gute Gedankenanstöße dabei, die ich nun zu folgendem funktionierenden Code zusammengebastelt habe:

    #include <stdio.h>
    
    int main() {
    
        int i, j, num1 = 12345, num2 = 51;
        char buf1[5]={0}, buf2[5]={0}, binaer[5];
    
        for (i=0; i < 5; i++){
          binaer[i] = '0';
        }
    
        sprintf(buf1, "%d\0", num1);
        sprintf(buf2, "%d\0", num2);
    
        for (i=0; i<strlen(buf2); i++) {
            for (j=0; j<5; j++) {
                if (buf2[i] == buf1[j]) {
                   if (binaer[j] != '1') {
                      binaer[j] = '1';
                      break;
                   }
                }
            }
        }
    
        for (i=0; i < 5; i++){
            printf("%c", binaer[i]);
        }
    
        puts (binaer);
    
        return 0;
    }
    

    Der Code bringt mit die Ausgabe 10001, wie gewünscht 👍

    Jetzt müsste ich nur noch wissen, wie ich mein 'binaer' am Ende säubern kann? Puts gibt mir noch ne Menge Müll am Ende aus...?
    /edit: habe was probiert, und funzt:

    binaer[5] = '\0';
    

Anmelden zum Antworten