Forum: PC-Programmierung C# Bitweises Trennen eines Int32


von Christian D. (chrissd)


Angehängte Dateien:

Lesenswert?

Hallo Community,



Ich versuche gerade für einen selbst gebauten USB-Signalgenerator die 
Windowsforms-Software, in C# zu schreiben, stehe aber vor einem großen 
Problem. Die Software soll die Werte für die Einstellung des µCs nach 
dem Datenblatt des Bausteins berechnen und diese per Emulierten 
RS232/USB-Schnittstelle an den Controller senden.

Wie auf dem Bild  zu sehen, habe ich einen 32Bit Integer. Dieser soll 
nach 14 Bits getrennt werden. Anschließend, sollen zwei 14 Bit Integer 
enstehen. Zu diesen wird jeweils 0x4000 addiert (zur Auswahl des 
Steuerregisters des µc). anschließend sollen die de entstandenen Daten 
über die Serielle Schnittstelle, mit 8Bit,  versendet werden.



meine Idee war nun, die Bits einfach zu shifften Die variable "helper" 
habe ich nur eingefügt um besser debuggen zu können:



1
                freqreg = 762357;          // 0xBA1F4 um die gleichen Werte wie in der Zeichnung zu bekommen
2
3
                int helper = 0;            // Hilfsvariable
4
                helper = (freqreg << 18);  // Hier ist meiner Meinung nach der Fehler wird zu -201614950
5
6
                helper = helper >> 18;
7
                tb_MSB.Text = Convert.ToString(helper, 16);              // funktioniert nicht 0xFFFFE1F5
8
                tb_LSB.Text = Convert.ToString(Convert.ToInt32((freqreg >> 14) + 16384), 16);      //funktioniert 0x402E

Mit dem Code wollte ich erreichen, dass die oberen 14Bit nach links aus 
der Zahl heraus geschoben werden und anschließend wieder alles mit 
Nullen aufgefüllt wird.

Leider wird nach dem ersten shifft die Zahl negativ, wohl durch das 
Vorzeichenbit. Also habe ich versucht, diese ans uint zu nehmen, dann 
lassen sich allerdings die anderen Operationen nicht mehr anwenden....



Ich hoffe Ihr könnt mir da helfen.



Vielen Dank schon einmal:-)

von Peter II (Gast)


Lesenswert?

Christian D. schrieb:
> Ich hoffe Ihr könnt mir da helfen.

denke schon. Du musst eine mit einer Bit Maske arbeiten. Also eine "Und" 
Verknüpfung.

von Tom (Gast)


Lesenswert?

Hallo Christian,

wenn du schreibst

"helper = (freqreg / 32768)"

steht die zweite Zahl, rechtsbündig in helper. Durch das teilen mit "2 
hoch 14" rückt die Zahl 14 Bitstellen nach rechts.

Gruß. Tom

von Uli (Gast)


Lesenswert?

'int' ist vorzeichenbehaftet, deshalb kommen da bei der Ausgabe etwas 
wilde Werte raus.  Auf Bit-Ebene ist das aber kein Problem.

Mit 'unsigned int' wird es etwas sauberer.
1
unsigned int freq = 0xBA1F4;
2
3
const unsigned int maskLower14Bits = (1 << 14) - 1;
4
unsigned int lsb = freq & maskLower14Bits;
5
unsigned int msb = (freq >> 14) & maskLower14Bits;

von Marcus W. (marcusaw)


Lesenswert?

Ich hab da gerade mal eine kleine, zugegeben - etwas "messy" Lösung 
gefunden:

Schamlos geklaut aus dem Netz, ohne groß Zahlen anzupassen:
1
int zahl = 762357;
2
int zahl1, zahl2;
3
string zahlString = Convert.ToString(zahl, 2);
4
string teil1 = zahlString.Substring(0,13);
5
string teil2 = zahlstring.Substring(14,28);
6
7
zahl1 = Convert.ToInt32(teil1, 2) +0x4000;
8
zahl2 = Convert.ToInt32(teil2, 2) +0x4000;

Ist von allen Lösungen die schlimmste, funktioniert aber :)

von katastrophenheinz (Gast)


Lesenswert?

Marcus W. schrieb:

> Ist von allen Lösungen die schlimmste.
Da hast du völlig recht.
Daher: Uli-Lösung nehmen.

von Lutz H. (luhe)


Lesenswert?

Ich würde die Daten erst in ein Array speichern, dann die Adresse dazu. 
dann senden.   C# hat ja auch das tolle bool, den Wahrheitswert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.