Problem bei Bit - Shiften



  • moin

    ich weis es gibt bestimmt schon viele threads dazu aber ich brauch trotzdem meinen eigenen um es einfach irgendwann mal zu rafen ...

    also:

    ausgangspunkt:
    2 hexadezimal zahlen (als CString):
    01 und 6C

    ergebnis:
    int Feld =
    v1[15] = 0
    v1[14] = 0
    v1[13] = 0
    v1[12] = 0
    v1[11] = 0
    v1[10] = 0
    v1[9] = 0
    v1[8] = 1
    v1[7] = 0
    v1[6] = 1
    v1[5] = 1
    v1[4] = 0
    v1[3] = 1
    v1[2] = 1
    v1[1] = 0
    v1[0] = 0

    so wie komm ich nun von meinem ausgang zu meinem ziel?
    als 1. wurde mir gesagt ich soll die variablen per atoi in ints verwandeln

    also

    CString str1="01";
    CString str2="6c";
    
    int zw1 = atoi(str1);
    int zw2 = atoi(str2);
    

    so nun sollte in
    zw1 = 1;
    und
    zw2 = 108;

    stehen...

    wie bekomm ich nun aus den zwischenzahlen mein feld gefüllt?
    bitte helft mir ich versteh es nicht ...

    mfg LT



  • sscanf kommt auch mit hexadezimalen Zahlen klar.

    Das i-te Bit bekommste mit

    (num >> i) & 1
    


  • Verständnisfrage:

    Meinst Du mit deiner Frage, wie bildet man die binäre Schreibweise einer Zahl auf ein Integer Array ab?

    In dem du das höchste Bit maskierst, und zw mit der Maske vergleichst. Danach ein Bitshift auf die Maske und den Vorgang wiederholen.
    Wenn du beim Vergleich eine 1 zurückbekommst schreibst du sie ins Feld v[].

    Ich spende mein erstes selbstgeschriebenes Programm (bitte nicht Lachen), damit du dir den Rest selbst erarbeitest.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        char zeichen;
        int eingabe,i;
        unsigned int maske;
        printf("Geben Sie einen Integerwert ein:\nAbbruch mit (a)!\n\n");
        do {
            maske = 0x80000000;
                scanf("%d", &eingabe);
                for (i=32;i>0;i--)
                {
                if (eingabe & maske)
                printf("1");
                else printf("0");
                maske >>= 1;
                }
            printf("\n\n");
            } while ((zeichen=getchar()) != 'a');
        //system("PAUSE");	
      return 0;
    }
    


  • void split32Bits(unsigned i,int *a)
    {
      memset(a,0,32*sizeof*a);
      while( i )
        *a++=i&1,i>>=1;
    }
    
    int main()
    {
      char *s="09ABCDEF";
      int i,a[32];
      split32Bits((sscanf(s,"%x",&i),i),a);
      for(i=31;i>=0;--i) printf("%d",a[i]);
      return 0;
    }
    


  • Geil! Auch dein erstes?

    Neuer Wettbewerb:

    Wer hat den kürzesten? 😃 😃



  • LordTerra schrieb:

    so nun sollte in
    zw1 = 1;
    und
    zw2 = 108;

    stehen...

    Wenn Du die beiden Zahlen (von 0 - 255) als int's vorliegen hast, dann zB. so:

    #include <stdio.h>
    
    int main()
    {
    	char v1[16];
    	int index;
    
    	int zw1 = 1;
    	int zw2 = 108;
    
    	char bit;
    
    	int gesamt = zw1 << 8 | zw2;
    
    	for(index = 0; index < 16; ++index)
    	{
    		v1[index] = (gesamt & 1) + '0';
    		gesamt >>= 1;
    	}
    
    	for(index = 15; index >= 0; --index)
    		printf("v1[%d] = %c\n", index, v1[index]);
    }
    


  • LordTerra schrieb:

    CString str1="01";
    CString str2="6c";
    
    int zw1 = atoi(str1);
    int zw2 = atoi(str2);
    

    so nun sollte in
    zw1 = 1;
    und
    zw2 = 108;

    stehen...

    Das wird so nicht funktionieren, da atoi nur Zahlen zur Basis 10 umwandelt.
    Du kannst strtol nehmen, da kannst du die Basis mit übergeben.

    int zw1 = strtol(str1,NULL,16); // Umwandlung zur Basis 16 (Hexadezimal)
    


  • ich habs derweile so gemacht:

    CString extStatusHigh="1";
                            CString extStatusLow="108";
    
    			int int_extStatusHigh;
    			sscanf (extStatusHigh, "%x", &int_extStatusHigh); 	
    			int int_extStatusLow;
    			sscanf (extStatusLow, "%x", &int_extStatusLow); 	
    
    			int *buf_status = new int[16];
    			for(int i=0; i<16; i++){
    				buf_status[i]=0;
    			}
    			for(int i=0; i<8; i++){
    				int x = (int_extStatusLow >> i) & 1;
    				buf_status[i]=x;
    			}
    			for(int i=0; i<8; i++){
    				int x = (int_extStatusHigh >> i) & 1;
    				buf_status[i+8]=x;
    			}
    


  • Deine 108 sind jetz aber dezimal. Oder?

    Denn 0x108 sind mehr als 8 Bit.



  • jo klar is ja nen CString ...
    das is einfach nur ne int zahl als text in nem CString...
    also jo in hex is das 0x6c



  • Ich glaube DirkB braucht keine Antwort auf die Frage, sondern weist dich vorsichtig daraufhin, das zu überprüfen. Dein sscanf liest eine Zeichenkette ein, die jetzt als hex Wert interpretiert wird und somit statt 0x6C 264 an die Zieladresse schreibt.

    Du deklarierst ein Array aus 16 Integer Werten um 2 Byte darzustellen?

    😕


Anmelden zum Antworten