[Playlisten] [Impressum und Datenschutzerklärung]

S07B Binärzahl aus Zeichenkette in Integer wandeln


CC-BY-NC-SA 3.0

Tempo:

Anklickbares Transkript:

alsweiteres Beispiel zu Reyes hätte ich gerne eine Funktiondie folgendestutsie nimmt eine Zeichenkettebestehend aus Einsen und Nullenzu eine Zeichenketteund macht daraus eine echte Zahleingehend oder vielleicht sogar ein longoder so hinkriegenauf jeden Fall erst mal ein insalso eine Binärzahlnehmen in gewisser Weise aber diese Binärzahlkommtals Zeichenkettean die können zum Beispieleingegebenworden seinund die Funktion soll darausein Kind machenschreiben Sie das mal als Funktion hinPunktes war das äußere von der Funktiones gibt ja dieseSchablonedass ich anfange mit dem Typen der?? zurück kommt aus der Funktion dann der Funktionsnamein den ich weiter lese binärdann in Klammern was die Funktion kriechtTypund Name der Variablenund in Schweifklammerwas die Funktion tatsächlich tutdas es fest dieses Musterdas es unverändertda Komma jetzt nichts dran drehenund überlegen für das Muster füllen was zurückkommen soll soll ein in seineinestandardmäßigeganze Zahlwas rein geht soll eine Zeichenketteseinalso ein Reh NC eine Reihe aus direkt andas nenn ich jetzt mal Internarrehwas rein geht halt jetzt in der gesamtenFunktion warso sehr das von außen außen jetzt Komma sich dann Gedanken darüber machen was denn ihnen passiertdieserBinärzahlals Zeichenkettemusste mir anscheinend irgendwieBit für Bitbearbeitet werden und irgendwie übersetzt werden in echte Zahlenso auf jeden Fall will ich hier in anderen diese ZeichenketteDurchlauf von vornist heute Laufvariabletypischerweiseetwas ganzheitlichesnehmen ??insihnstarte mit nullandas etwas sich gerade normal ausdie for-Schleifewie lange läuft die for-Schleifesehen ?? gleich nochgehen einer Schrittenin Schweifklammerwas diese for-Schleife tutschon wieder so Schablonen ??Funktion zu definierenwas im Typ kommt zurück wie heißt die Funktion was geht rein Schweifklammerund erlebt dann das Innere der Funktion bei der for-Schleifein runden Klammernso die äußeren Angaben von bisin welchen Schritten und in den Schweifklammerund stehtwas sie for-Schleife den wirklich tun solldurchgängigesMuster in C und sein Nachfolger sprachenso der hier andie Fortsetzungsbedingungnicht die Abbruchbedingunghier steht die Fortsetzungsbedingungwie lange soll die Schleife laufenso lange wie das hier war wird was ich statt der drei Fragezeichen reinschreibenunddie ganzschlichte antike Lösung wäre es solange das aktuelle Zeichen nichtdie Nummer null ist solange mach ich das unsicher halber noch mal diese Nummer null hierist was anderesals diesesZeichen was auf dem Bildschirm als null erscheintdas hat nicht die Nummer null undEinzelzimmer gar nicht die Nummer null also keine Verwechslungsproblemedas wäre die for-Schleifejetzt ist der JobZeichen einzusammelnzu guckenist es nach einsnullkönnten sicherheitshalber auch gucken uns ganz was anderes ist und dasvergessen wenn's ganz was anderes istPersonen Zimmer einzusammelnsiebzig ist es geht ohne Potenzendannich führedas mal vor mit Dezimalzahlenwenn die Sonne Dezimalzahlhaben wieeins zwei drei vier fünfund die einlesenwürdenerst die Ziffer eins okay ich merke mir die Zahl einsdann kommt die Ziffer zwei ich seh es gibt ?? zweite Stelle es gibt ?? zweite Stelle das heißt die einzig eben eingelesen habemuss ein Surbandimuss ich mit zehn multiplizierenund dann kann ich die zwei draufrechnenund dann kommtder dritte Stelle das heißt diese zwölf die ich bisher habemuss eins rüber die muss ich mit zehn multiplizierenund dann kann ich die drei rauf rechnen habe ich die hundert dreiundzwanzig?? kommt noch ?? Stelle sehe ich ?? okay ich schiebe das was ich habe eine Stelle darüber mal zehnund dann kann ich die vier drauf rechnenund so weiterdas werde Gedanke man speichert sich dem Zwischenergebnisund ?? Feste des Kopf auch wasnimmt man das Zwischenergebnismal so zu viel ums einstelle rüber zu schiebenund hier in Binärsystemnatürlich nicht mal zehnsondern mal zweiWochen sie keine Potenzmenge mit der sich von links anfangen zu lesenund warum keine Potenzfunktionich musste irgendwie in der for-Schleife ein Resultat generierendannhättest es aber mal sagen ??was Resultatsound dieses Resultat muss ich auch zum Schluss zurückgebensoweit Kanister schon hinschreiben da führt kein Weg dran vorbeidashilft manchmaletwas hinschreiben was verstehen mussohne wenn und aberanund nun in der for-Schleifewar ja der Gedankewenn ich verständlichfinde eine neue Stellenämlich das bisherigeResultatmal zweiund addiere das was ich von der neuen Stelle habeich den ganz wenigen Zeilen jedes Mal wenn ich feststelle hier kommt was neu istdas bisherige Resultat mal zwei nehmenund das neue dazu addierenund angeblich zum Schluss das Resultat zurückdas geht sehr kurz Komma willman kann eins zu eins umsetzen und sich in gesagt habe in jedem Schritt sobald ein neues Zeichen findewirdmit zwei multipliziertist die Frage ?? könnt es schon so gestalten Resultatmal gleich zwei in jedem Schritt egalwas passiertbei zwei nehmenanund wenn das aktuelle Zeicheneiner eins istder Formwird siegleich gleich natürlichwenn das aktuelle Zeichen einer eins istdannerhöhe ich das Resultat noch um eins das wäre dieganz geradlinige Umsetzungjedes Mal wenn ich hier in den Schleifenkörperreingehe weiß ich es gibt eine neue Stelleals das bisherige eins rüber schieben mal zweiin dieser kurze Schreibweise mal gleich zwei statt Resultat ist gleich zweimal ResultatResultat mal gleich zwei den bisherigen Wert verdoppeln vom Resultatdannwenn er die Ziffer null gestanden hatmuss ja nicht zu verdoppeln ist es erledigtmit den Ziffer eins gestanden hat muss es eben um eins erhöhen eins drauf addiert aufs Resultatals in jedem Fall mal zweiwerden nur wenn dann A eins drin steht in meiner Zeichenkette dann nämlich obendreinnoch plus einsklappt das alles dann erledigtdas nicht ?? total sichere Lösungabergar was jetzt passieren wirdund wie sie Funktion diese binäringroß Zist gleichleseeinfachmal etwas was ich mirzusammenreimenkannPunktdas wäre dann einsvierund achtundsechzehnhundert zwanzig also wenn alles richtig funktioniertguckendurchdie localin der Tat fünfundzwanzigso weit sieht's gut aus Komma Domain Einzelschritten was passierteinen die Funktiondannersetzterst mal hiermeine Resultat variabel auf null schönletzt fange ichlinks anmit der Zahleins fange ich ander Ziffer eins fang ich andas steht nicht das Symbol mit der Nummer null in der Zeichenketteokaynunsehen dass es nicht gerade Effizienzmich ich hab die null drin stehen im Resultatim ersten Schritt verdeutlicht das Resultatimmereiligst das mit dem lösen nicht das ich im ersten Schritt dasResultat verdoppelt Beistrich einen kulturellenGenuss zum bisher leichter zu schreibenalsoineffizientaber leichter zu lesen im ersten Schritt verderblich immer die null bisschen blödeigentlichso dann guck ich steh da gerade die einsversteht die eins also das Resultat um eins vergrößernfeinnächsterdas Feuer noch mal die Ziffer einsnächster Schrittist noch nicht am Ende so das was da jetzt steht dieZahl eins einenein Bit nach links rutschenzweiundweil die Nässe Ziffer wieder nach ein zwarum eins erhöhen ?? wenn ich jetzt bei dreibis jetzt habe ich alsodiese beiden ihre selbst das ist dieZahl drei binäraber es kommen noch drei Stellennoch drei Bitsdie nächste Stelle sind null ?? modifiziertnur mit zweiist eine zwei sechsdas wären die ersten drei Bitsin der sechsdann kommt noch meine nullKomma zwei nehmen Troll zwölfähmwenn sie schon von hexadezimaldas ist ja das zehn hexadezimaleins eins null null versehen hexadezimalund das ist doch ?? mal zweizwanzigund die einst ?? drauf dann habe die fünfundzwanzigso wird dann funktioniertdas sieht auch soweitdann plausibelaus soder Ärger ist jetzt nochähm was passiert wenn hier irgendwelcheblödsinnige Sachen in der Zeichenkette stehen dann möchte ich natürlichvielleichtbei dem ersten blödsinnigen Zeichen aufmöchte sagen diese die Einsen und Nullenso lange bis du irgendwas findest was keiner eins ist und was keine null ist am?? und gib einfach das zurück was du bis dahin gefunden hast hübscher wäre man jetzt irgendeine Fehlermeldung zurückgeben könntebeim nächsten Semester mit Exceptionswas man da tun könnte hier für dich jetzt ein Versagen die Funktion soll lesen solange sie Einsen und Nullen findetwenn sie wieder einzelne Nullen findetund sowas soll's einfach nur zurück gebensoll ist so lang wie sie also neun findet und dann aufhörenamwie müssen Sie das jetzt ändern dass sie automatisch aufhört wenn sie was anderes findet als ?? eins oder null nullVorschlagelsSchweifklammerannullwas auf dem Bildschirmsowasambesten mal drüber redenja also wenn es die null ist habe ich das Problem wenn es die Zahl null in der Zeichenkette ist die Ziffer null in der Zeichenkette ist stelle ich fest ?? endlich in das Elsrand welcher sofort aufhören es ist nicht gut alsoalternativerVorschlagwäre jetztweiter diskutieren?? hier zu kochen ist es auch nicht die nullbeim if guck ich es ist die einsInsels gehe ich rein wenn nicht die einzige istman kann ?? gucken und obendreinauch nicht die null ist dann weiß ich da ist was faulanwird das funktionierendann würde ich hier immer die null zurückgebenalso so weit wird es funktioniereninsofern das ich immer die null zurückgebenwürde wenn ich hier hin geheund stelle festes ist nicht die eins also nicht in SF reines ist nicht die einsStelle obendrein fest es ist aber auch nichtdie nullein wenig außer Funktion den Wert null zurückgebenso weit würde das funktionierenanjetzt ?? wollte ich aber wie gesagt nicht den Wert null zurückgebensondern ich wollte zurückgebenwas bisher eingesammelt wordenstattdessenallendie ganzen Bits bis dahin bis zum ersten Zeichenwas nicht mehr null und eins ist als ich möchte jetzt nicht zwangsweiseden Null ausgebenwie kann ich mich da rauswindenstark ReturnresultatPunkt ?? Nummer ganz genau hines gibt einen Ärgernisdasist wohl das Problem ist wenn ich hier mit dem ersten falschen Zeichen rein komme in die for-Schleifeder sofort ohne wenn und aber mal zwei genommenwürde hier diefünfundzwanzigeingesammelthaben sie das Xund in dem Durchgangin dem er das X sieht Zack sofort mal zwei fünfzigfünfzig tausend nicht vierundzwanzigich gehe dann zwar mit dem Resultat raus aber das Resultat wäre fünfzigweil es schneller mal zwei ?? ?? Vorschlag wäredas sie natürlich schlimm aus nicht erst mal zwei und dann wieder durch zweiHerrenallein schonin Effizienzproblemist nicht so dramatisch dass siedamit Effizienz ist hundertprozentigoptimal sind aber eher das größere Problem ist es auch ein Bereichsproblemstellen sich vordass sie hier mit diesem mal zwei geradeKante von den möglichen Zahlenbereichgehenund dann teils wieder durch zwei das wäre total ärgerlich wenn ich nämlich dannnicht mal zwei durch zwei genommen hätte dann wäre ich noch im Rahmen des erlaubten gebliebenals ichschränke die den Geltungsbereichmeiner Funktion benötigt ein wenn ich das so machean so wird es funktionierenaber das ist noch nicht schönwas an besonderen Möglichkeitenalsoder Trick istdas mit dem Ford zu formulierenich gehe nur dann in die Schleife reinwenn einer eins stehtoder null steht das heißt ich kriege hier eine ganz andere Bedingungschreiben Sie mal die Bedingungaufder ?? muss gar nicht mehr auf dienull am Ende gucken das ergibt sich dann automatisch ich guckeist das aktuelle Zeichendie Ziffernulloderist das aktuelle Zeichen die Ziffer eins so lange soll die for-Schleife laufenwenn es weder noch ist gehe ich gar nicht hier reinhabe ich nicht den Ärger dass das Resultat sofort mal zweiwirdso kann das Aussehennur sicherheitshalbermal in Aktion hiereinigeFunktionenso sind sofort ganz zu Beginn prüfte schon beim allererstenZeichennummer null sozusagen prüfte den schon ist es nun oder ist es nach einses ist null oder nach eins also geht er reinund es kommt das Wasser schon hattenzählen hierzwei in die gefährliche Zone hier in zwanzig Hammer schonganzokay et cetera soweitvon zwanziger eingesammeltdas nächste Zeichen ist weder eine null noch eine einsZack for-Schleife beendetKomma mit dem Resultat fünfundzwanzig zurück wie sich das gehörtso wäre dashübscher als jetzt hier untenamKnochenels zu haben und dann wieder durch zwei zu teilenkann ich wirklich den Bereich der Kind vollständig ausschöpfendas wäre ?? Maßnahmezu checkenob man im erlaubten Bereich istder Mann nicht im erlaubten Bereich ist es zu groß wird für den Entdas man dann irgendwelcheSicherheitsmaßnahmenergreiftsiehier also gucken bevor man das Resultat mal zwei nimmt ob man da aus dem Ruder läuft ob der Bereich zu groß wirdund er stellt sich die große Frage ja schön ich sehe dass die Zahl zu groß wird aber wie kann ich das denn bitte dem Anwender dieser Funktion mitteilenundklassische C denkewas einen heute graue Haare bereitet klassische C denke wäregegeben noch einig typischerweiseZahlen ab null aufwärtspositive Zahlen oder Null zurück dann mach ?? doch mal für den Fehler einfach zu ?? minus eins wir gucken ob jedes Resultat schon zu groß geworden ist und zu groß geworden ist im minus eins zurück oder sowas ?? das wäre klassische C denkeanunsichere Geschichte aberso hat man immer gerne programmiert