Archiv verlassen und diese Seite im Standarddesign anzeigen : Will integer Zahl in 3 Bytes zerlegen
Import-Script
21.08.2003, 18:54
Hallo, ich will die zahl 405600 in 3 Bytes zerlegen also ein Highbyte ein Midbyte und ein Lowbyte <BR> <BR>das wäre dann <BR>High = 6 <BR> mid = 48 <BR> Low = 96 <BR> <BR>gibt's da eine Funktion unter VB6 ? <BR> <BR>oder wer kann mir da anders weiterhelfen ? <BR>
Import-Script
21.08.2003, 19:51
Hi Tobias, <BR> <BR>wie kommst du bei 405600 auf 6 / 48 / 96? Ist das dezimal oder hexadezimal? Ich kann deine Rechnung nicht nachvollziehen. <BR> <BR>Gruß, <BR>Heiner
Import-Script
21.08.2003, 20:04
das soll dez. sein <BR> <BR>also <BR> <BR>High___________Mid____________low <BR>6_______________48____________96 <BR> <BR>6* 2^16________48* 2^8________96 <BR> <BR>= 393216_______=12288_________96 <BR> <BR>high + mid + low = 405600 dez. <BR> <BR>ich weiß nicht ob das so richtig gerechnet habe... <BR>die Striche sind nur abstandshalter und die rechnung erfolgt spaltenweise
Import-Script
21.08.2003, 20:29
Hi, <BR> <BR>entschuldige bitte, wenn ich da nochmal nachfrage. Was soll mit der Zahl nach der Zerlegung passieren? Ich sehe noch keinen sinnvollen Zusammenhang zwischen Art der Zerlegung und dessen Weiterverarbeitung. <BR> <BR>Im einfachsten Fall hätte ich die Zahl in Zweiergruppen aufgeteilt: <BR>Hi:40 <BR>Md:56 <BR>Lo:00 <BR> <BR>Ergebnis: <BR>00101000 00111000 00000000 <BR> <BR>Gruß, <BR>Heiner
Import-Script
21.08.2003, 20:35
ich will diese zahl byte - weise über die serielle schnittstelle zu einem µC schicken <BR>dazu benutze ich aus dem Buch "Elktronic am PC" die Port.dll mit dem Befehl <BR> <BR>sendbyte byte1 <BR>sendbyte byte2 <BR>sendbyte byte3 <BR> <BR>das soll ein Steuerprogramm für einen kleinen Funktionsgenerator sein und ich will die Frequenz seriell zu dem µC schicken und die Frequnez ist eine zahl die etwas über 70000 liegt deswegen brauch ich 3 Byte <BR> <BR>also auf dem Papier funkt. die zerlegung schon aber am PC ...
Import-Script
21.08.2003, 20:39
auch ja der sollwert für die frequenz errechnet sich aus wert = f / 0,0732... <BR>deswegen oben eine zahl über 100000 <BR>das wären bei 100khz = 1366120 also recht hoch
Import-Script
21.08.2003, 20:42
Hi, <BR> <BR>dann mache davon doch einfach einen 24 Bit bzw 3 Byte-Wert. Das ist genau was du wolltest. <BR> <BR>1366120(dec) = 14(hex) D8(hex) 68(hex) <BR> <BR> <BR>Gruß, <BR>Heiner
Import-Script
21.08.2003, 20:49
hallo, <BR> <BR>das verstehe ich jetzt nicht wie soll ich den das machen ? wieso nochmal in das Hex format wandlen ? <BR> <BR>ein anderes Beispiel : <BR> <BR>ich habe einen AD Wandler der mir sein Wert als 12Bit wert rausbringt - ich kann aber übr die serielle Leitung nur Byte - weise was senden wie zerlege ich also den 12Wert ?
Import-Script
21.08.2003, 21:17
ich hätte da eine Idee das ganze teilen durch 2^16 <BR>dann nach 8 Stellen nach links rotieren wieder durch 2^16 Teilen das wäre dann das midbyte und dann nochmal 8 Stellen nach links rotieren und wieder durch 2^16teilen das wäre dann das lowbyte <BR> <BR>aber wie tut man in VB eine Variable rotieren lassen ????
Import-Script
21.08.2003, 21:30
Der Computer macht intern keinen Unterschied, ob die Zahl dez, hex oder bin ist. Wenn du 1366120 in einer Variablen speicherst (i.d.R. also eine 4-Byte-Variable), dann steht, wie Heiner geschrieben hat, im höchstwertigen Byte 00(hex), im nächsten 14(hex), dann D8(hex) und im niederwertigsten 68(hex). <BR>Oder im im höchstwertigen Byte 0(dez), im nächsten 20(dez), dann 216(dez) und im niederwertigsten 104(dez) - das ist genau das gleiche, nur jedes Byte einzeln umgerechnet, so wie du es in deinem zweiten Beitrag gemacht hast, Tobias. <BR>Wo ich dir leider nicht helfen kann, ist, wie man in Basic Zahlen zerlegt. In C würde man Bits schieben, d.h. <BR>byte4 = zahl >> 24; <BR>byte3 = (zahl >> 16) & 0xff; <BR>byte2 = (zahl >> 8) & 0xff; <BR>byte1 = zahl & 0xff; <BR>Vielleicht kann das nun jemand anders in Basic übersetzen? <BR> <BR>Heiner, zu deinem zweiten Beitrag: Das (Zweiergruppen) ginge nur, wenn du die Zahl schon _als Zeichenkette_ vorliegen hast. Das ist bei Tobias aber scheinbar nicht der Fall. Allerdings, vielleicht ist das in Basic sogar leichter zu realisieren: <BR>a$ = str$(zahl) <BR>byte1 = val(right$(a$, 2)) <BR>byte2 = val(mid$(a$, len(a$)-4, 2)) <BR>oder so ähnlich
Import-Script
21.08.2003, 21:32
Oh, da hast du, während ich am Schreiben war, die Lösung - und das Problem mit dem Schieben bzw. Rotieren - schon selbst gefunden.
Import-Script
22.08.2003, 11:08
Die klassische Methode eine beliebige Dezimalzahl in ein beliebiges anderes Zahlensystem abzubilden ist immer wieder durch die Basis des Zahlensystems zu teilen bis der Dividend 0 wird. Dann die Reste von unten nach oben lesen. Dazu gibt es die DIV Funktion zum Teilen und die MOD Funktion die den Rest liefert. Ein Beispiel: Die Zahl 34 dezimal soll im 2er System dargestellt werden <BR> <BR>34 : 2 = 17 Rest 0 <BR>17 : 2 = 8 Rest 1 <BR>8 : 2 = 4 Rest 0 <BR>4 : 2 = 2 Rest 0 <BR>2 : 2 = 1 Rest 0 <BR>1 : 2 = 0 Rest 1 <BR>Dividend ist jetzt Null, also fertig. <BR>Die Reste von unten nach oben "100010" <BR> <BR>Das Ganze soll jetzt ins Oktal-System (Basis 8) <BR>34 : 8 = 4 Rest 2 <BR>4 : 8 = 0 Rest 4 <BR> <BR>also 34(dez) = "42"(okt) <BR> <BR>Noch einen? Heiner schreibt: was zu beweisen wäre. <BR>1366120(dec) = 14(hex) D8(hex) 68(hex) <BR> <BR>also ins 16er System (hex) umrechnen: <BR>1366120 : 16 = 85382 Rest 8 <BR>85382 : 16 = 5336 Rest 6 <BR>5336 : 16 = 333 Rest 8 <BR>333 : 16 = 20 Rest 13 --> 13 = "D" in HEX-Schreibweise <BR>20 : 16 = 1 Rest 4 <BR>1 : 16 = 0 Rest 1 <BR> <BR>und siehe da, Heiner hat Recht "14D868" <BR> <BR>alles klar? --> das ist mit Popel-BASIC oder was anderem in einer Schleife in NullkommaNix erledigt.<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR> <BR>
Import-Script
22.08.2003, 11:59
Divisor = 0 heisst´s!!! - sorry <BR> <BR>Quotient = Dividend : Divisor <img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
23.08.2003, 17:56
Hallo Andreas, <BR>gut, dass du mein Grundlagen-Digitaltechnik-Wissen aufgefrischt hast. Aber darum ging es in der ursprünglichen Frage doch gar nicht! Denn das, was du schreibst, betrifft hauptsächlich die Darstellungsweise, beispielsweise zur Bildschirmausgabe. <BR>Um Tobias' Problem zu lösen, müsste er ins 256er-System umrechnen: <BR>1366120 : 256 = 5336 Rest 104 (hex 68) <BR> 5336 : 256 = 20 Rest 216 (hex d8) <BR> 20 : 256 = 0 Rest 20 (hex 14) <BR>- und damit hätten wir die Zahl in 3 Bytes zerlegt! Interessante Methode, aber ich denke, im Normalfall nimmt man die Bit-Schiebe-Methode, denn Divisionen sind für den Prozessor doch mehr Arbeit. <BR>
Import-Script
24.08.2003, 10:53
@Daniel:Wie Du an Deinem Rechenbeispiel siehst ist es egal ob man "Nibbleweise" d.h. Digit für Digit also 4-Bittig oder gleich Byteweise an die Sache herangeht. Kommt aufs gleiche raus. Die Nibblemethode hat halt den Vorteil, dass Du in einer Schleife immer schön mit Stringverkettung den Ausgabestring zusammenschieben kannst. <BR>AusgabeString$="" <BR>Loop <BR>...teilen gemäss siehe oben <BR>AusgabeString$=Rest$+Ausgabestring$ <BR>until Quotient = 0 <BR> <BR>-- da hab ich mich verschlimmbessert, sorry. <BR>War nicht so mein Quotiententag... <BR> <BR>Na ja, jedenfalls geht das in Basic halt schön einfach. Übrigens Beispiel Turbo-Pascal Compiler und auch idR. alle Compiler setzen für DIV bzw. Turbo auch wenn er erkennt, dass der Divisor eine 2er-Potenz ist automatisch Schiebebefehle bei der Codegenerierung ein. Schau Dir mal mit einem Debugger den jeweils erzeugten Code an. <BR>B = A DIV 2 <BR>B = A / 2 <BR>und dann <BR>B = A DIV 3 <BR>B = A / 3 <BR> <BR>im oberen Beispiel wird geschoben was das Zeug hält, ratz fatz, unten geht es richtig ans Rechnen. <BR>Gilt natürlich nur wenn man A und B nicht als Double-Precision-Floating Point oder sowas deklariert; also Integer oder Longint oder Word.<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
24.08.2003, 15:26
OK, Andreas, hast recht. Ich wusste nicht, wie schlau Compiler sind. <BR>Trotzdem würde mich jetzt noch interessieren, wie man in Basic Bits schiebt. Hab früher etwas Basic programmiert, Schieben aber offenbar nie gebraucht.
Import-Script
24.08.2003, 17:01
DEFINT A <BR>REM oder besser einfach A% "A-Prozent" schreiben, <BR>REM also <BR>B% = B% SHR 1 : REM oder SHL... <BR> <BR>REM Lauflicht am LPT1: <BR>FOR I% = 0 to 7 <BR>OUT &h378,INT(2^^I%) <BR>REM oder <BR>REM OUT &h378,(1 SHL I%) <BR>REM Lauflicht mit 2 ..(3 SHL I%) Bit 0 und 1 setzen und dann beide shiften <BR>NEXT I% <BR> <BR>REM BASIC ist garnicht so schlecht...<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
07.09.2003, 01:11
Hi, <BR> <BR>So weit ich mich erinnerrn kann, kann man bei Basic eine Zahl in eine Variabel schreiben. Tut man das Hexadezimal, so kann man mit mid$() die Nibbelpärchen rausschneiden und daraus wieder eine Zahl machen. <BR> <BR>Vielleicht gibt es auch mid(), das man mit Zahlen verwenden kann... <BR> <BR>Gruß <BR>Elmar
Import-Script
07.09.2003, 01:45
Das Thema ist doch schon längst gegessen!
Import-Script
07.09.2003, 13:24
Ja, aber warum nicht: Nur die Überschrift lesen, ein paar Zeilen blubbern (ggf. am Thema vorbei und nach dem Motto "ich hab dazu mal was gewusst, aber hab's vergessen und kann dir leider nicht helfen"), und schon ist der eigene Beitragszähler wieder um eins höher.
Import-Script
07.09.2003, 16:58
<img src="http://progshop.com/elektronik/diskussion/clipart/rofl.gif" border=0> <BR><img src="http://progshop.com/elektronik/diskussion/messages/4285/8677.jpg" alt=""> <BR><img src="http://progshop.com/elektronik/diskussion/clipart/rofl.gif" border=0>
Import-Script
24.09.2003, 03:02
lange diskussion, kurze lösung: <BR> <BR> <BR>wert = 405600 <BR>bytea = (wert 65536) <BR>byteb = (wert 256) and 255 <BR>bytec = (wert) and 255
Import-Script
24.09.2003, 14:08
Es gibt doch noch "gute Programmierer"!!!<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
25.09.2003, 01:56
ach ja: <BR> <BR>umwandeln in hex: <BR>hexwert = hex$(123) <BR> <BR>umwandeln zurück: <BR>zahl = clng("&H93DF")
Powered by vBulletin® Version 4.1.7 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.