myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [C] Hilfe bei Bitshifting Operatoren (https://mygully.com/showthread.php?t=1925355)

Rioter 19.10.09 09:52

[C] Hilfe bei Bitshifting Operatoren
 
Hallo,

mein Problem ist folgendens. Ich bin totaler Programmier Anfänger und brauche Hilfe.
Die Aufgabenstellung sieht so aus das ich ein Programm schreiben soll das die Binärpräsentation eines Integers ausgeben soll. Die einzelnen Bytes sollen mit "|" getrennt werden und der Integer soll vorher eingelesen werden.

Bitte um rasche Lösungsvorschläge

Schon mal danke im voraus

urga 19.10.09 12:03

also das hier funktioniert, allerdings wird nicht abgefangen ob auch wirklich ein int eingelesen wurde. versuch aber bitte zu verstehen was da passiert.
Code:

// ein int belegt sizeof(int) bytes.
        // damit sizeof(int)*8 bits. [bN, .... b1, b0]
        // wenn ich nun eine 1 auf position bN bringen möchte, muss ich
        int shift = ((sizeof (int)) * 8) - 1;
        // shift mal die 1 nach links schieben.
        unsigned int pattern = 1 << shift;
        // pattern ist nun [1, 0, 0 , .... , 0]
        int the_int;
        // the_int ist der int der binär ausgegeben werden soll.

        printf ("bitte einen int eingeben ");
        scanf ("%d", &the_int);
       
        // nun muss N (also shift+1) mal geprüft werden ob bei the_int das N'te bit gesetzt ist.
        int i;
        for (i = 0; i <= shift; i++) {
                if (the_int & pattern) {
                        printf ("1");
                }
                else {
                        printf ("0");
                }
                // nun noch die 1 im pattern um eine position nach rechts.
                // (*) aus der doku:
                // The right shift operator causes the bit pattern in the first operand to be shifted right the number
                // of bits specified by the second operand.
                // Bits vacated by the shift operation are zero-filled for unsigned quantities.
                // For signed quantities, the sign bit is propagated into the vacated bit positions
                //
                // wir wollen das nullen nachgeschoben werden. desshalb ist pattern unsigned...
                pattern = pattern >> 1;
                if (i < shift) {
                        printf ("|");
                }
        }
        printf ("\n");


Rioter 21.10.09 01:10

Thx
 
Danke für die rasche Antwort, aber viel schlauer bin ich noch nicht geworden.
Hab mal das von dir gepostete kompiliert hat aber nur fehlermeldungen rausgespuckt.
So ganz hab ich auch noch nicht verstanden was bei dir the_int & pattern macht.
Wo werden die Bits dahin geschoben dass sie das integer als Binärezahl darstellen?

Danke für ne rasche anwort :D

urga 21.10.09 01:33

1) das was ich gepostet habe ist kein komplettes c-programm
da gehört noch mind:
Code:

#include <stdio.h>
#include <stdlib.h>
int main()
{
.....
}

drumherum :)
2) probier das mal, und poste dann die fehler.
3) unter welchen os programmierst du? und mit welchem compiler ? z.b. gcc unter linux ...

4) the_int & pattern: am beispiel anhand von 4 bits:

sei the_int = 5 = [0,1,0,1]
und pattern zum anfang [1,0,0,0]
[0,1,0,1] & [1,0,0,0] = 0

dann jeweils pattern = pattern >> 1;
[0,1,0,1] & [0,1,0,0] = 1
[0,1,0,1] & [0,0,1,0] = 0
[0,1,0,1] & [0,0,0,1] = 1

das if (the_int & pattern) wird wahr wenn im ergebnis von the_int & pattern auch nur ein bit auf 1 steht.

also wenn a = b & c;
und a,b,c sind vom typ int.
dann ergibt sich das ergebnis c aus der bitweisen UND-vernüpfung von b und c.
also [aN, .. a1, a0] = [bN AND cN, ...., b1 AND c1, b0 AND c0]

Rioter 22.10.09 11:23

bytes trennen durch |
 
Hab ne andere Variante um von Dezimal auf binär umzurechnen. Mein Problem is aber, dass ich nicht weiss wie ich alle bytes mit | voneinander trennen soll. Habs mit ner for schleife probiert klappt aber milde gesagt nicht so ganz. Ich hoffe du kannst mir helfen...

#include <stdio.h>

int main()
{
unsigned int value,i;
unsigned int bin[32];
printf("Please enter an integer:");
scanf("%d",&value);
int j;
for(i=0;i<32;i++)
{
bin[i]=((value>>i)&1);

}

for(i=0;i<32;i++)
{
for (j=8;j<32;j++)
{
if ( j <= (j+8))
{
printf ("|");
}
}
printf("%d",bin[31-i]);
}

printf("\n");
return 0;
}

urga 22.10.09 13:17

ach die bytes sollen getrennt werden.
ok.
Code:

for (i = 0; i < 32; i++) {
 printf("%d",bin[31-i]);
 if (i+1 % 8 == 0) printf (" | ");
}

müsste klappen (ungetestet)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.