#1 28.09.2017 16:55:23

stefu
Mitglied

Wofür ist bitweises verschieben & Co. geeignet?

Hallo zusammen!

Ich habe eine Frage rein aus Interesse, nicht wegen den für mich praktischen Nutzen.

Zurzeit arbeite ich das Tutorial von C-HowTo durch. Weniger, weil ich unter die Programmierer gehen möchte, sondern einfach aus Lust und Dollerei und zu schauen, inwieweit ich das mit meinen eingerosteten Pascal und Basic Kenntnissen in Einklang bringen kann. In der Schule mussten wir damals Pascal nehmen und privat machte ich vieles in Q- und Visual-Basic.

Meine Frage bezieht sich auf die Bitmanipulationen.

Wann macht eine bitweise Verschiebung in der Praxis Sinn?
Wofür braucht man AND, OR, XOR und die Negationen im Konkreten?

Mir geht es einfach nur darum zu erfahren, was die Einsatzzwecke dafür sind, da ich die Bitmanipulationen zwar verstehe und manuell berechnen kann, allerdings keinerlei Vorstellung davon habe wofür das gut und und was man damit konkret anfangen kann.

Vielleicht bringt ja jemand Licht ins Dunkle.

Lieben Gruß
Stephan

Offline

#2 28.09.2017 17:07:51

stefanhusmann
Moderator

Re: Wofür ist bitweises verschieben & Co. geeignet?

Das kommt m.E. noch aus einer Zeit, in der Schnelligkeit der Programme alles war. In Assembler wurde so programmiert, und C sollte halt ähnlich hardwarenah verwendbar sein wie Assembler.

Offline

#3 28.09.2017 20:19:00

TBone
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

Das wird auch heute noch genutzt. Beispiele sind Systemaufrufe, schau mal unter: man 3 open (O_APPEND | O_CREAT | O_WRONLY)
Würde man hier keine Bits setzen, müsste man eine Menge Bools übergeben. (Moment, C und Bool?)
Ich persönliche finde es dann so doch viel lesbarer, da ich nicht wüsste, welches Bool dann was bedeutet. (Ok, es sei denn, jemand übergibt einfach eine 12...)

Bitmanipulation (vorallem XOR) wird beispielsweise in Verschlüsselungsalgorithmen häufig benutzt. Einfaches Beispiel https://en.wikipedia.org/wiki/XOR_cipher

In Verbindung mit Hardware kann es dir auch einiges erleichtern: Beispielsweise habe ich mal mit 8 LEDs entwickelt, die sich über einen 8-Bit Wert ansteuern ließen. Das erste Bit bringt die erste zum Leuchten, das zweite die zweite, usw.
Möchte ich nun einfach, dass diese "durchlaufen", speichere ich mir meine 8-Bit, ROtate Right ihn um eins, und volia.

Es gibt unzählige Beispiele, diese Liste ist eigentlich beliebig erweiterbar smile

Offline

#4 28.09.2017 21:54:21

Gering-ding-ding-ding-din
Gast

Re: Wofür ist bitweises verschieben & Co. geeignet?

stefanhusmann schrieb:

Das kommt m.E. noch aus einer Zeit, in der Schnelligkeit der Programme alles war.

Also wenn ich mir den Resourcenverbrauch und die ewig lange Ladezeit der heutigen Webbrowser so anschaue, finde ich die Grundidee Perfomance-optimiertes Programmieren doch irgendwie ungemein sexy.

#5 29.09.2017 07:43:26

T.M.
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

Es ging ja um Verschiebungen, nicht um bitweise AND- und OR-Operationen.

Eine praktische Anwendung für Bitverschiebungen ist z.B. der Zusammenbau bzw. das Zerlegen von Words (und grösseren Datentypen) aus oder in einzelne Bytes.

Wenn man einen Integer mit zwei Bytes Länge hat (meist heisst er short) und man will den in zwei einzelne Bytes zerlegen, dann muss man zwangsläufig das höhere Byte in dem Integer bitweise um acht Positionen nach rechts verschieben, um es anschliessend einer Variable zuweisen zu können. Es ist syntaktisch nicht möglich, das höhere Byte in einem Zwei-Byte-Integer direkt an eine Variable zuweisen, auch andersherum geht es nicht.

Anwendungsfälle liegen beispielsweise bei der Konvertierung von Zeichensätzen, Kryptografie, Komprimierungsalgorithmen u.ä., sehr oft also dort, wo ein gegebener Inhalt in eine andere Form transformiert werden soll, ohne den Inhalt zu verändern.

Im Windows-API gibt es zudem zahlreiche Fälle, wo Message-Parameter (WPARAM, LPARAM) aus einzelnen Bytes zusammengesetzt werden müssen. Die Message WM_SIZE beispielsweise, die an ein Fenster gesendet wird, nachdem es seine Grösse verändert hat, besitzt einen LPARAM (32bit Integer), der in den unteren 16 bit die neue Breite und in den oberen 16 bit die neue Höhe des Fensters enthält. Der Empfänger muss diesen Wert zerlegen, um damit arbeiten zu können. Es gibt deshalb, weil das so häufig vorkommt, unter Windows extra Makros dafür (MAKELONG, MAKEWPARAM, MAKELPARAM, MAKELRESULT, HIBYTE, LOBYTE, HIWORD, LOWORD).

Offline

#6 29.09.2017 11:33:45

stefu
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

Hallo zusammen!

Danke für eure zahlreichen Antworten, die es tatsächlich vermögen Licht ins Dunkle zu bringen.

Die Zeit in der Schnelligkeit der Programme alles war, kenne ich noch selbst.
Nicht nur Schnelligkeit - mehr Arbeit machte mir damals mein Arbeitsspeicher - unter MS-DOS 2.1 hatte ich 128 kb. Unter MS-DOS 5 gönnte ich mir den Luxus von 640 kb. Und das war seinerzeit wirklich Luxus.
Uriger weise war da mehr mit möglich, als sich ein Jugendlicher heute mit 16 GB Arbeitsspeicher und 4 GHz Rechner vorstellen kann. wink
Assembler fand ich zugleich spannend und lästig. Nutzte es nur für Speicherrelevante Dinge. *sich_schüttelt.

Das praktische und sehr leicht verständliche Beispiel XOR_cipher fand ich exzellent, um einen Nutzen wirklich auch verstehen zu können.
Ebenso die Steuerung von 8 LED über die bitweise Verschiebung, wenn ich so etwas auch nicht entwicklen könnte (hardwareseitig und dann die Hardwareansteuerung via Software), so kann ich es mir im Geiste plastisch vorstellen. Danke dafür.

Das es notwendig ist, um Datentypen zu zerlegen wäre mir als Laie nie eingefallen.
In meiner kleinen Laien-Welt würde ich mir denken, dass hier zwei Werte besser wären als ein großer.
Dass dies zur Transformation notwendig ist, ergibt in Ansätzen Sinn für mich; in Ansätzen deswegen, weil ich hier natürlich keine Ahnung von habe, jedoch meine zu wissen, was gemeint ist, dank dem gut verständlichen Absatz darüber. Danke dafür.
Das ein Fensterwert aus einen LPARAM besteht, der dann auf diese Art zerlegt werden muss, um Breite und Höhe zu gewinnen, hätte ich mir auch nie im Traum vorstellen können. Spannend.
Auch auf die Gefahr hin, dass es für jemanden der hier Profi ist dumm wirkt, erlaube ich mir die Frage, weswegen dieses Vorgehen besser ist als zwei getrennte Werte, die direkt abgerufen werden können?

Danke für eure tolle Hilfe und vor allen Dingen für die Beispiele aus der (verständlichen) Praxis!!!

Offline

#7 29.09.2017 12:33:13

T.M.
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

stefu schrieb:

Auch auf die Gefahr hin, dass es für jemanden der hier Profi ist dumm wirkt, erlaube ich mir die Frage, weswegen dieses Vorgehen besser ist als zwei getrennte Werte, die direkt abgerufen werden können?

Eine Notwendigkeit für zusammengesetzte Werte liegt in der dann vorhandenen Möglichkeit, sie vergleichsweise einfach verteilen und verarbeiten zu können, selbst in Prozessorregistern und sogar über Prozessgrenzen hinweg, was ja in der Message-Verarbeitung der Fall sein muss. Es wirft hingegen sehr schnell ernsthafte Probleme auf, wenn man grössere, zusammengesetzte Datenwerte per Message verschicken will, beispielsweise einen struct oder auch eine Zeichenkette. Wie soll ein anderer Prozess dann darauf zugreifen? Man muss dabei auch bedenken, dass Messages gepostet werden können, d.h. dass ihre Verarbeitung nicht unmittelbar synchron, sondern ggf. asynchron erfolgt, irgendwann später, wenn der Empfänger Zeit hat. Das bedeutet aber dann auch, dass der Empfänger festlegt, wann er auf die Parameterwerte zugreift, wie lange diese also bereitstehen müssen.

In anderen Fällen ist es schlicht praktisch, zusammengesetzte Werte gemeinsam zu verarbeiten, beispielsweise Zeichen, die in einem Multi-Byte-Zeichensatz vorliegen, z.B. wchar_t, der eben nicht als struct von zwei Bytes definiert ist, sondern schlicht als unsigned short. Und es gibt ja Zeichensätze, die bis zu vier Byte pro Zeichen erlauben. Eine Sortierfunktion von Integern sieht immer wesentlich einfacher aus als eine von structs mit mehreren Einzelwerten.

Offline

#8 29.09.2017 18:18:00

stefu
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

Danke für die Antwort!

Offline

#9 29.09.2017 22:03:05

TBone
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

Vielen Dank für das ausführliche Feedback, es freut mich, dass ich dir weiterhelfen konnte. smile

Offline

#10 02.10.2017 20:52:08

WorksAsIntended
Mitglied

Re: Wofür ist bitweises verschieben & Co. geeignet?

Ein guter Grund für Binäroperationen ist auch immer, wenn man damit eine if-Abfrage verhindern kann. Bei den heutigen, sehr guten Compilern zwar selten nötig (häufig baut er das Gleiche wie wenn man einfach seine If-Abfrage schreibt), aber nicht gänzlich uninteressant. Vor allem wenn man eine Platform wählt, die dadurch extrem ausgebremst wird. Ich denke sofort an Cuda oder OpenCL, eine Graka wird durch ifs unglaublich ausgebremst.

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums