http://www.pronix.de -> Forum -> C-Programmieren

Unterseiten

Forum: C-Programmieren

Moderatoren: juergen, Martin Conrad

Thema: Binärdarstellung mit besonderer Vorgehensweise

  • (nur registrierte Mitglieder)
Hallo zusammen, ich soll eine ganze Zahl mit der Hilfe von Bitoperanden binär darstellen.

Ich habe in C bereits Erfahrung und das Buch von Herr Wolf gelesen, aber der Algorithmus bereitet mir Schwierigkeiten.

Ich glaube aber, dass es wahrscheinlich mit den Shiftoperanden lösbar sein könnte.

Das ist eine Teilaufgabe von den Hausaufgaben an der Uni.

Es wäre nett, wenn jemand eine Strategie nennt, wie man vorgehen könnte.

cheers cryl0v
 
Hi,

Zitat:
..., aber der Algorithmus bereitet mir Schwierigkeiten.


Weißt du allgemein wie man Dezimalzahlen in Binärzahlen umrechnet (also mit Zettel und Stift)?

Falls ja: Wie würdest du in C testen, ob zB das unterste Bit einer Zahl gesetzt ist? Wie das zweite Bit? Und das dritte? Daraus kann man schön eine Schleife bauen Grafik: Smilie Zwinker

Ich wollte nicht gleich die Lösung verraten, würde dir ja den Spaß an der Aufgabe nehmen, aber falls der Tipp nicht ausreichend war, einfach wieder nachfragen.

mfg, Wolfgang

--
Hex, Bugs and Rock 'n Roll

 
Ok als Beweis der Umwandlungsfähigkeit die Uhrzeit ohne Doppelpunkt als Beispiel

2022 : 2 = 1011 R 0
1011 : 2 = 505 R 1
505 : 2 = 252 R 1
252 : 2 = 126 R 0
126 : 2 = 63 R 0
63 : 2 = 31 R 1
31 : 2 = 15 R 1
15 : 2 = 7 R 1
7 : 2 = 3 R 1
3 : 2 = 1 R 1
1 : 2 = 0 R 1

Nur als Beweis, dass mir etwas an dem Lösungschritt liegt :D

Nun zu deiner Frage:

Vielleicht weiß ich es, aber es fällt mir nicht ein. Schleife ist auch schonmal klar.
Das unterste Bit könnte ich wie oben in der Umwandlung gezeigt durch ein Modulo und dem daraus
resultierenden Rest bestimmen.

Ich weiß nicht, ob es das ist was dir im Sinn liegt. Ich muss aufjedenfall "Operatoren zur Bitmanipulation" verwenden. Da liegt das Problem^^
 
Zitat:

Ich muss aufjedenfall "Operatoren zur Bitmanipulation" verwenden. Da liegt das Problem^^


Link-Tip: Wiki: Logische Verknüpfung (externer link)

Angenommen wir haben eine Zahl x, und wollen testen, ob das unterste Bit gesetzt ist, dann könnten wir die Zahl mit einer zweiten Zahl logisch UND-verknüpfen, wobei wir als zweite Zahl eine Zahl wählen, bei der nur das unterste Bit gesetzt ist (also die Zahl 1).

Wenn das unterste Bit nicht gesetzt ist, kommt numerisch 0 raus, sonst nicht.


int x;
int y;
int t;  // t für "temporäre Variable"

x = 12345;
y = 1;

t = x & y;

if( t == 0 )
{
   printf( "Das unterste Bit war NICHT gesetzt" );
}
else
{
   printf( "Das unterste Bit war gesetzt" );
}


Wenn wir jetzt statt dem untersten Bit das nächste Bit test wollten, dann könnten wir die Variable y mit einem geeigneten Bit-Operator entsprechend verändern (Wir wollen das Bit weiterschieben).

mfg, Wolfgang

--
Hex, Bugs and Rock 'n Roll

 
Danke für deine Hilfe !!!

Das meinst du also. Die Idee habe ich übrigens auch gehabt, aber ich dachte ich muss die Zahl erst umwandeln und hatte vergessen, dass ich es direkt angeben kann.

Ich habe mich mal an den Code gemacht, aber irgendwo einen Denkfehler.

Als Wert gebe ich 8 ein und es mus das rauskommen, aber er schiebt nicht den letzen Bit

00000000 00000000 00000000 00001000

der Wert 0x7FFFFFFF EDIT: 0x80000000 ist das höchste Bit soll das Limit von int darstellen, also 2^31. Ich bin mir aber nicht sicher, ob ich richtig eingetippt habe im Windows Calculator^^

zumindestens wollte ich
10000000 00000000 00000000 00000000

rauskriegen


EDIT: 21:36

Ich habe vergessen, dass das letzte Bit das Vorzeichen darstellt. wenn ich
01000000 00000000 00000000 00000000

umwandle, dann ist y = 0x40000000

Dann kommt das erwartete Ergebnis raus.

Jetzt noch die Frage, wie geht man an die negativen ganzen Zahlen ran *grübel*




#include <stdio.h>
#include <stdlib.h>

void wertleser(int *wert);

int main(void) {
 
 int i, x, y, counter;
 y=0x7FFFFFFF;
 counter=1;
 
 printf("Bitte ganze Zahl eingeben: ");
 wertleser(&x);

 
 for(i=0; i < 31; i++) {
  if (counter % 8 == 0) 
   printf(" ");
  if(x & y) 
	printf("1");
	else 
	 printf("0");
	counter++;
	y = y >> 1;
  }
 
 
 getchar();  
 return 0;
}

void wertleser(int *wert) {
 int zahl;
  
 
  if(scanf("%d",&zahl)!=1) {
  
  do {
   printf("\nERROR: Bitte nur Zahlen eingeben: ");
   fflush(stdin);
  }
   while (scanf("%d",&zahl)!=1);
  *wert=zahl;
  }
   else {
    *wert=zahl;
   }
  }
 
  • (nur registrierte Mitglieder)