Hallo ich möchte mit ANSI C eine Funktion erstellen, der ich einen INT Wert übergebe und die dann die Anzahl der BITS der größten Gruppe nebeneinander stehender 1-Bits zurück gibt. z.B. 111000111100 Ergebnis: 4 Wie kann man so etwas in C lösen?
Hi Neuling Die erste Frage beim Programmieren sollte zwar nach der Lösung gestellt werden, jedoch noch keine Programmiersprache enthalten. Du must dir also einen einfachen Alogrithmus überlegen, der in diesem Falle etwa so aussehen könnte: - Solange INT stellen hat - Ist Stelle X=1? - Ja: Zähler i erhöhen - Nein: - Ist der Zähler i grösser, als er schon mal war(iMax)? - Ja: iMax ist nun i - Zähler auf 0 zurücksetzen - Nächste Stelle X anschauen Jetzt musst du das nur noch in C festhalten. Stichworte dafür sind Bedingungen, Schleifen und Bitoperatoren. HTH Tom
Danke für den Tipp. Ich hab da Probleme jetzt das in C zu realisieren.
Ich habe mal die Funktion so programmiert: DIe Funktion funktioniert noch nicht. Wo könnte da der Fehler sein? void AnzBitgroup(int wert) { int dez, i, iMax=0; int dual[8]; dez = wert; for(i = 0; i < 8; i++) { dual[i] = 0; /* Dualzahl löschen */ } i = 0; if ((dez >= 0) && (dez <= 255)) /* Wert zulässig? */ do { /* sukzessive Division */ dual[i] = dez % 2; /* aktuelle Dualstelle speichern */ dez = dez/2; /* abdividieren */ i++; } while(dez > 0); for(int m = 0; m < 8; m++) { if(dual[i]==1) { i++; } if(dual[i]==0) { if(i>iMax) { iMax = i; } } i=0; } printf("Ausgabe:%2d", iMax); }
nabend was nun kommt ist im fieberwahn geschrieben und wird nicht so unwahrscheinlich hilfreich sein 1. du machst kein c sonden c++ da du in der for schleife m erst definierst 2. was passiert überhaupt, gibts compilermeldungen? 3. schonmal die stringverarbeitungsmöglichkeiten angeschaut ? (zumindest in c++ gibt sachen wie Strgtoint(); oä.) 4. schon mal zwischenwerte nach jdem schritt betrachtet? 5. könnte es sein das ein klammer in der letzten for schleife fehlt weil du dann ja jede runde dein i=0 setzt? Mischa
so nun hab ich halbwegs gerafft was dein ziel is, 39° um die uhrzeit sind echt nicht meine welt. du solltest in deiner letzten for schleife nicht i als index nehmen sonden m und jedesmal i=0 zu setzten is auch nicht ideal generell if (dual[m]) i++; else { if(i>iMax) iMax = i; else i=0; } sollte es auch tun aber ohne garantie Mischa
besser wäre if(i=>iMax) ansonsten würdest du bei gleicher größe das ganze ja wieder nullen ps: schade das editieren hier nicht geht
Wie wäre es so: int max1Folge(int Zahl) { int i, imax, j; i=0; imax=0; for(j=0;j<8;j++) { if((Zahl >> j) & 1) i++; else { if (imax < i) imax = i; i = 0; }; }; if (imax < i) imax = i; return imax; }
Die Funktion tut noch immer nicht was ich will. for(int t = 0; t < 8; t++) { if(dual[m]==1) { m++; } else { if(iMax<m) { iMax = m; } m = 0; } } printf("Ausgabe:%2d", iMax); Wenn ich als Dez. Zahl 123 vorgebe, dann kommt bei iMax 2 heraus. Da müsste aber deann 4 erscheinen.
iMax = 0; i = 0; for(t=0;t<=15;t++ { if (wert & (1<<t)) { // an der Stelle steht eine 1 i++; } else { if (i>iMax) { iMax = i;
zweiter Versuch... iMax = 0; i = 0; for(t=0;t<=15;t++ { if (wert & (1<<t)) { // an der Stelle steht eine 1 i++; } else { if (i>iMax) iMax = i; i = 0; } } Man vergleicht den Werte mit einer wandernden 1 ("1<<t") und zählt für jede 1 i hoch. Steht an der Stelle eine 0, wird das Ergebnis des Vergleichs falsch, und i wird mit iMax verglichen, ob i inzwischen grösser als iMax ist. Ausprobiert habe ich es nicht...
Hi Rahul, ich habe meinen C Code abgeändert. Funktioniert nicht zu 100%. Wenn ich eine Dez Zahl vorgebe: 210 210 dez = 11010010 binär Dann bringt mir die Funktion "1" heraus und nicht "2". Es passiert nur dann, wenn ganz links eine 1 steht.
Vermutlich geht es darum, in einem seriell abgetasteten Signal die Impulslänge zu bestimmen (IR-Code ?). Da ist es doch am einfachsten, gleich beim Samplen mit zu zählen: if( bit == 1 ) count++; else count = 0; Peter
Du must am Ende noch einma imax mit i vergleichen, da du ansonsten am Ende den größten wert in i hast, aber wenn dann keine Null mehr kommt, dieser nicht mehr in imax geschrieben wird.
Hast du denn meine Version mal ausprobiert? Deine sieht ziemlich umständlich aus. Jetzt habe ich meinen Code mal unter AVRStudio ausprobiert, aber irgendwie stellt das nicht mal ne normale for-Schleife richtig dar.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.