| 

.NET C# Java Javascript Exception

6
Hallo,

wie erstelle ich in C# einen Datentyp selbst, der grössere Werte beinhaltet als die bekannten Datentypen? So was wie BigInt, BigDecimal sollen dabei nicht verwendet werden.

Ich möchte einen usigned integer erstellen, der grössere Werte als ulong annehmen kann. Ich will damit die folgenden Berechnungen ausführen:

xor
Rotation
Multiplikation

String-Berechnung soll entfallen. Auf die Frage kam ich durch:

Codekicker Link...

Diese Frage hängt sehr nahe an meiner!

Hilft jemand?
20.03.2014
Sybille 147 1 5
Ich arbeite ungern mit Entwicklern aus Deutschland zusammen. Deutsche UNIs = Hilfsschule! Deutsche Entwickler schauen nur auf das Geld, nicht auf ihre eigene Leistung. Für das was du anscheinend machen willst, denke ich an das grosse Versagen von Deutschland (NIST-Einreichung --> Telekom). Für solche Anfragen solltest du nicht in Deutschland anfragen - einfach mal das Ausland nutzen. Ich hab das leider auch erst sehr spät begreifen müssen.
boga 20.03.2014
@boga: Was hast Du denn geraucht? Alle in einen Topf werfen...na ja!
Xantiva100 20.03.2014
2
@Boga: Nun, deutsche Hilfsschüler schaffen es immerhin, ihr Problem sauber zu beschreiben. Nicht wie Du in diesem Thread hier: http://codekicker.de/fragen/Dateispeicherung-Rechte-Stick
Jens Duczmal 20.03.2014
@Sybille: Ich habe meiner Antwort ein Update zugefügt!
Falkner 21.03.2014
1
Streitet euch ruhig weiter auf meiner Frage. Ich möchte mich hier nicht anschliessen...!
Sybille 21.03.2014
3 Antworten
5
Die folgenden Zeilen sollen led. als Teil einer möglichen Lösung zu verstehen sein!

Zuerst einmal vielen Dank, dass du meine Frage als Link mit integriert hast. Da ich vor einem ähnlichen Problem stehe, hier mal den Ansatzpunkt meiner Überlegungen.

Ich wollte das Ergebnis mit mehreren ulongs erzielen. Da ich keine Zeit f. Versuche damit bisher hatte (fast 24 Std.-Arbeitstag), habe ich dir ein Fragment aus dem Kopf aufgezeichnet, welches ev. Fehler enthalten kann, weil ich das nicht ausprobiert habe. Auf ähnliche Art kann das aber funktionieren.

Du möchtest 3 Arten der Berechnung durchführen, wobei XOR kein Problem darstellen sollte. Multiplikation musst du selbst noch mal schauen, ob du das rein mathematisch irgendwie lösen kannnst. Rotation könnte auf einem ähnlichen Weg gemacht werden, wie das folgende Fragment zeigt:

n ist die Anzahl der Verschiebungen (möglich ist hier leider nur max. 64)
u sind 2 ulongs, die zusammenhängend rotiert werden sollen

public static ulong[] test(ulong[] u, int n)
{
ulong tmp1 = u[0], tmp2 = u[1];

u[0] = u[0] << n;
u[1] = u[1] >> n;
u[0] = u[0] | u[1];

u[1] = tmp2 << n;
tmp2 = tmp1 >> n;
u[1] = u[1] | tmp2;
return u;
}



Wie gesagt - ungetestet!!! Vielleicht hilft es ja als Denkanstoss.


Update

In meinem obigen Fragment steckten Fehler. Ich habe gerade einen Moment Zeit gefunden und hier ist nun die Lösung für eine Linksrotation für 128 Bit (Verarbeitung mit 2 ulongs).

Aufruf:


using System;
using System.Text;

class Program
{
public static void Main(string[] args)
{
ulong[] dUl = new ulong[2];

dUl[0] = uint.MaxValue;
dUl[1] = 1;

string s1 = ConvertToBinary(dUl[0]);
string s2 = ConvertToBinary(dUl[1]);

Console.WriteLine(s1 + "-" + s2);

int n = 68;
int n2 = 128 - n;
dUl = TwoUlongRotation.RotL(dUl, n);
s1 = ConvertToBinary(dUl[0]);
s2 = ConvertToBinary(dUl[1]);
Console.WriteLine(s1 + "-" + s2);
dUl = TwoUlongRotation.RotL(dUl, n2);
s1 = ConvertToBinary(dUl[0]);
s2 = ConvertToBinary(dUl[1]);
Console.WriteLine(s1 + "-" + s2);

Console.Write("\nPress any key to continue . . . ");
Console.ReadKey(true);
}

private static string ConvertToBinary(ulong value)
{
if(value==0)
return "0";
int i = 64;
System.Text.StringBuilder b=new System.Text.StringBuilder();

while(i-- > -1)
{
b.Insert(0,((value&1)==1) ? '1' : '0');
value>>=1;
}
return b.ToString();
}
}

/*Statische Klasse*/
internal static class TwoUlongRotation
{
internal static ulong[] RotL(ulong[] u, int n)
{
ulong t1h, t1l, t2h, t2l;
n %= 128;

if(n == 128)
return u;

if(n == 64)
{
t1h = u[0];
u[0] = u[1];
u[1] = t1h;
return u;
}

if(n > 64)
{
t1h = u[0];
u[0] = u[1];
u[1] = t1h;
n -=64;
}

t1h = u[0] << n; t1l = u[0] >> (64 - n);
t2h = u[1] << n; t2l = u[1] >> (64 - n);
u[0] = t1h | t2l; u[1] = t2h | t1l;
return u;
}
}


Ich hatte für die Erstellung nur 20 Min. Zeit. Falls jetzt noch was nicht ganz richtig laufen sollte, kannst du das bestímmt leicht selbst korrigieren. Mit etwas Ausbau kann man auf diese Art fast jede erdenkliche Blockgrösse rotieren. Ich hoffe das hilft schon mal etwas.
21.03.2014
Falkner 795 3 9
Falkner 795 3 9
@Falkner: Hey, du hast dir wirklich viel Mühe gemacht! Vielen Dank!!!!! Ich probiere das gleich mal aus.
Sybille 21.03.2014
@Falkner: So, ich habe deinen Code eben eingebaut. Für mich sieht das so aus, als wenn es fehlerfrei funktioniert. Auf jeden Fall ist das ein Weg, der gut aussieht.

Was programmiertst du? Wie schreibt man so was in 20 Minuten? Musst nicht Antworten - nur wenn du willst. Danke nochmal! Ich glaube schon, dass ich das verwenden werde.
Sybille 21.03.2014
@Falkner: Datentyp selbst erstellen geht anscheinend nicht. Aber mit deinem Code bekomme ich meine Sache auch hin. Da die beste Antwort von dir kam und sehr hilfreich ist, setze ich den Haken bei deiner Antwort.
Sybille 22.03.2014
@Sybille: Ich hatte viel zu tun. Deshalb schreibe ich erst jetzt einen Kommentar zu Deinen 3 Kommentaren. Ich betätige mich in einem Bereich, der sehr selten ist. Die Freude ist auf meiner Seite, wenn ich helfen konnte!
Falkner 23.03.2014
0
Falls Du an einen eigenen "primitiven" Datentyp wie int usw. denkst - das ist in C# leider nicht möglich. Man könnte zwar einen Datentypen in Assembler erzeugen und auch aus C# ansprechen, aber dies wäre immer "unsafe" und dieser müsste trotzdem in einer Klasse "verpackt" werden.

Wenn Du also einen Typ mit bereits bestehenden Typen in C# definieren willst, dann geht das am einfachsten über eine eigene Klasse (struct wäre auch geeignet), die auch die Operatoren für diese Klasse definiert.

Für Deinen Anwendungsfalls ist vielleicht byte[] mit entsprechenden Operationen geeignet.
20.03.2014
edvservice 1,4k 1 6
@edvservice: Danke für die Erklärung. Mit Byte wollte ich nicht arbeiten.
Sybille 21.03.2014
0
Ich weiß nicht, was Sie helfen können, wenn Sie ehrlich sind
02.11.2017

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH