C# Zahlenraum Variabel machen ohne Kaskade

while (!(zahl & 0xFF000000))
wenn 4. byte eine null ist, führe die schleife aus

zahl = zahl << 8;
verschiebe die bits der 'zahl' um acht stellen nach rechts.

die methode 'int bestimmteByteLänge(int zahl)' ist als funktion definiert. dh, sie liefert dir an der stelle von 'return' etwas zurück.

mach mal

Code:
int test = bestimmteByteLänge(999);

in der variable 'test' wird der wert 3 stehen.
 
Ein while ist doch ebenso eine Kaskade.
Ja klar. Aber er meinte eher so...

Code:
if(...)
{
     ...
}
else
{
     if(...)
          {
           ....
          }
          else
          {
                if(...)
                     {
                      ...
                     }
          }
}

So hat er es, ganz easy und Quick&&Dirty.
Wir sollen einen anderen Lösungsweg finden. ;)
 
jedenfalls ist der code deines lehrers falsch.

der wertebereich von char(8bit) liegt von -128 bis 127 //variable ist vorzeichenbehaftet
der wertebereich von unsigned char(8bit) von 0 bis 255 //variable ohne vorzeichen

wenn bloß der code deines lehrers auf eine iterative lösung umgewandelt werden soll, sehe das so aus:

Code:
QString bestimmeWertebereich(long long zahl)//für alle fälle 64bit vorzeichenbehaftete eingabe
{
	long long wertebereiche[] = //hier 6 werteintervalle
	{
		-128, 127,					//(signed) char, 8bit
		0, 255,						//unsigned char, 8bit
		-32768, 32767,				//short, 16bit 
		0, 65536,					//unsigned short, 16bit
		-2147483648, 2147483647,	//(signed) int, 32bit
		0, 4294967295				//unsigned int, 32bit
	};

	QString wertebereich_str[] = 
	{
		"8bit_mit_vorzeichen",
		"8bit_ohne_vorzeichen",
		"16bit_mit_vorzeichen",
		"16bit_ohne_vorzeichen",
		"32bit_mit_vorzeichen",
		"32bit_ohne_vorzeichen"
	};

	for (int i = 0; i < 12/2; i++)
	{
		if ((zahl >= wertebereiche[i*2]) && (zahl <= wertebereiche[i*2+1]))
		return wertebereich_str[i];
	}
}

ausgabe von
Code:
 str = "die eingegebene zahl ist vom typ: " + bestimmeWertebereich(-2312);
würde "die eingegebene zahl ist vom typ: 16bit_mit_vorzeichen" lauten.
 
Zuletzt bearbeitet:
@[GP] mino
Du verstehst mich nicht...
Wir haben ja nicht verschiedene Value-Types benutzt, sondern nur ein Value-Type z.B long.
Der Zahlenbereich vom long geht wie wir alle nunmal wissen
von –9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807
Somit erreicht man 2hoch32. ;)
 
müsstest deine frage vielleicht nochmal konkretisieren :)

mit long erreichst du plus/minus 2^(64-1)
 
[GP] mino schrieb:
müsstest deine frage vielleicht nochmal konkretisieren :)

Hab den Thread jetzt mittlerweile 2 oder 3 mal gelesen, aber die Frage entzieht sich mir auch ;) Was soll das ganze? Wozu dieser Wertebereich?
 
Das hier ist wahrscheinlich auch die falsche Antwort, aber vielleicht reicht sie ja, um den Lehrer zu ärgern.

Code:
long l = 70000; // hier die Eingabe.
string bitRepresentation = Convert.ToString(l, 2);
Console.WriteLine(bitRepresentation);

Wenn der Lehrer auf volle 4er-Bit-Blöcke besteht:

Code:
long l = 70000; // hier die Eingabe.
string bitRepresentation = Convert.ToString(l, 2);
if ( bitRepresentation.Length % 4 != 0 )
{
    bitRepresentation = bitRepresentation.PadLeft(bitRepresentation.Length + ((bitRepresentation.Length % 4) - 4) * -1, '0');
}
Console.WriteLine(bitRepresentation);

Wenn der Lehrer auf Trennzeichen zwischen den Blöcken besteht. Ähm. Pech. :D
 
Also meine Frage ist die:

Wie mache ich ein Array Variabel in 8ter schritten.

--->[2^8, 2^16, 2^24 und 2^32]

Wenn man eine Zahl eingibt, soll das Programm selbständig berechnen, wie viel Bit man für diese Zahl brauch.
Das ganze soll ohne eigene Methoden/Funktionen (da wir das noch nicht hatten, kann sein das es einfacher ist, aber so ist das nunmal ;) ) ablaufen und keine Kaskade sowie:

Beispiel:
Code:
if(...)
{
     ...
}
else
{
     if(...)
          {
           ....
          }
          else
          {
                if(...)
                     {
                      ...
                     }
          }
}
oder ähnliches.

Eine If/else, for schleifen, do-while etc, dürfen wir benutzen. Wir sollen es aber so klein machen wie möglich machen/halten.

d.h.
Zahl eingeben (egal welche)
Diese mit dem Horneschema ausrechnen und das Programm soll keine Nullen abschneiden oder derartiges. Sondern die Dualzahl mit den berechneten Bitanzahl ausgeben.

Eingabe: 11 (3398)
Horner Schema: for(int i = ...)
Ausgabe: 0000|1011 (0000|1101|0100|0110)

Ich habe es Hardkodiert, sodass immer 16 Bit angezeigt werden. Also darf bei mir ein gewisser Zahlenbereich (2^16 = 65536-1) nicht überschritten werden. Dies soll ich variabel machen.
 
Okay, ich denke mal es wird dann sowas werden (ohne irgendwelche großen Methoden oder sonstiges)
Code:
[COLOR="Blue"]int[/COLOR] c = 0;
for ([COLOR="Blue"]long[/COLOR] i = 1; Math.Abs(e)*2/i != 0; i *= 16,c++)
{ }
[COLOR="blue"]int[/COLOR][] a = [COLOR="blue"]new int[/COLOR][c*4];

Du hast also folglich einfach einen Zähler, der überprüft, wie viele 4er Blöcke du brauchst.
Hierbei ist dann auch direkt der negative Anteil berücksichtigt, in Form, dass bei der Abfrage die Zahl mit 2 Multipliziert wird. (c ist der Zähler und e die Eingabe)
Ist dann halt nur ne ziemlich sinnlose, kaum etwas tuende for-Schleife ^^

#EDIT: Die Eingabe als Betrag zu berechnen, könnte man natürlich auch weglassen, ist aber nen sinnloser Tick von mir ^^.
 
Zuletzt bearbeitet:
Xsp schrieb:
Also meine Frage ist die:

Wie mache ich ein Array Variabel in 8ter schritten.

--->[2^8, 2^16, 2^24 und 2^32]

Wenn man eine Zahl eingibt, soll das Programm selbständig berechnen, wie viel Bit man für diese Zahl brauch.

Irgendwie habe ich das Gefühl, dass du überhaupt keine Ahnung hast, was du da überhaupt machst :)
Deine Frage wurde in diesem Thread schon x-mal beantwortet. Am einfachsten geht es über Bit-Shifts. Dabei steht es dir frei, ob du in 1er, 4er oder 8er Schritten vorgehen möchtest.
 
Okay ;) EDIT: Alles murks was hier geschrieben stand, es ist möglich mit Bit-Shifts, man sollte sich vorher Gedanken machen ^^, tschuldige also dafür, aber ich hab Bit-Shifts nur einmal im Studium nebenbei zu tun gehabt und nie mit Dezimalzahlen verwendet, weshalb ich vorschnell reagiert habe.
 
Zuletzt bearbeitet:
PapstRatze schrieb:
Ich verstehe zwar, das die Frage nicht ganz einfach nachzuvollziehen ist ;), aber mit Bit-Shifts ist es nicht möglich das Horner-Schema umzusetzen. (Außerdem war nicht die Frage nach der Umwandlung, sondern wie er an die Größe des Arrays kommt.)

Blablabla...

Code:
int dezimal = 65000;
int bitRequired = 0;
while ( dezimal != 0 )
{
    dezimal = dezimal >> 1;
    bitRequired++;
}

// bitRequired = 16
int[] array = new int[bitRequired];
 
PapstRatze schrieb:
Und was willst du mit negative Zahlen machen ;)

#EDIT: Am Ende ist es möglich, hab ich so nicht drüber nachgedacht.

Wenn die Zahl negativ ist, ist die Größe des Arrays = sizeof( int ) * 8. Oder welchen Typen er auch immer benutzen mag.

Edit.
Das sollte man vorher prüfen, zumindest wenn er den Code-Schnippsel oben verwenden möchte.
 
Irgendwie habe ich das Gefühl, dass du überhaupt keine Ahnung hast, was du da überhaupt machst
Doch das habe ich. ;)
Ich habe seit 2 Jahren Programmieren, und hänge immernoch in der Unterstufe meine Ausbildung, dank Programmieren.

Ich habe erst dieses Schuljahr so richtig hineingefunden.
Was mich verwirrt, sind euro Codes. Mag sein, das die Funktionieren, ich versuche auch durchzublicken und diese zu verstehen. Aber einige Code schnipsel verstehe ich nicht, da wir das in der Schule noch nicht hatten. Ich weis nicht wann ich diese in meinem Code benutzen soll. Ich bin noch kein guter Programmierer, ich möchte es aber werden. Ich hänge mich voll rein, was man über das Forum natürlich nicht sieht. Ich recherchiere natürlich wie eure Codes funktionieren etc.

Das nenne ich Quick&&Dirty.
Den verstehe ich auch. Simple. :)
int dezimal = 65000;
int bitRequired = 0;
while ( dezimal != 0 )
{
dezimal = dezimal >> 1;
bitRequired++;
}

// bitRequired = 16
int[] array = new int[bitRequired];
 
Xsp schrieb:
Was ist den dieses
Code:
 return
?

Xsp schrieb:
@holy
Danke für die super Erklärung, dass habe ich mir letztes Jahr auch schon angeguckt, aber das brauche ich nicht wirklich für die Aufgabe.

Xsp schrieb:
Ich habe seit 2 Jahren Programmieren, ...

Xsp schrieb:
Ich hänge mich voll rein, ...

Xsp schrieb:
Ich recherchiere natürlich wie eure Codes funktionieren etc.

Xsp schrieb:
Den verstehe ich auch. Simple. :)

Du bist immun gegen Hilfe.
 
:D
Na wenn das so aussieht ^^
Ergänzung ()

Blablabla...
Code:
int dezimal = 65000;
int bitRequired = 0;
while ( dezimal != 0 )
{
    dezimal = dezimal >> 1;
    bitRequired++;
}
 
// bitRequired = 16
int[] array = new int[bitRequired];

Damit gehts, vielen Dank :)
 
Zurück
Oben