Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » bitoperator

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.07.2003, 10:53 Uhr
~lucky luke
Gast


hallo.

wie kann ich mit c aus

C++:
0000 0000 1111 0110

dass machen?

C++:
1111 0110 0000 0000

und dann einen anderen wert
z.B.

C++:
0000 0000 1010 0011

_________________________
in das LSB rein schreiben:

C++:
1111 0110 1010 0011
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.07.2003, 11:03 Uhr
0xdeadbeef
Gott
(Operator)



C++:
int a = 1<<7 + 1<<6 + 1<<5 + 1<<4 + 1<<2 + 1 <<1; /*0000 0000 1111 0110*/ ;
int b = a << 8; /* a um 8 nach links verschoben: 1111 0110 0000 0000 */
int c = 1<<7 + 1<<5 + 1<<1 + 1; /*0000 0000 1010 0011*/
int d = b | c; /* bitweise geodert, 1111 0110 1010 011. In diesem Fall wäre auch */
int e = b + c; /* möglich, weil es keine Überschläge gibt.*/


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.07.2003, 11:18 Uhr
~lucky luke
Gast


oh, so was meinte ich, genau! Dankeschön!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.07.2003, 11:30 Uhr
0xdeadbeef
Gott
(Operator)


Der 'bitweise nach rechts verschieben'-Operator ist dann analog:

C++:
b = a >> 1; /* weis b den Wert von a um ein bit nach rechts verschoben zu.*/


Was auch sehr schön ist, sind die entsprechenden Zuweisungsoperatoren:

C++:
a >>= 1; /* verschiebt a und ein bit nach rechts... */
b <<= 2; /* ...und b um 2 nach links. */


Die ganze Sache funktioniert allerdings nur ganzzahlige Typen, floats und doubles kannst du so nicht in der Gegend rumschubsen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.07.2003 um 11:31 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.07.2003, 11:45 Uhr
virtual
Sexiest Bit alive
(Operator)


Vorsicht:
Rechtsverschieben zieht bei einem int das Vorzeichen einfach mit. BEsser dann mit unsigned arbeiten, es sei denn, solche Effekte sind gewünscht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.07.2003, 13:26 Uhr
ao

(Operator)



Zitat:
0xdeadbeef postete

C++:
int a = 1<<7 + 1<<6 + 1<<5 + 1<<4 + 1<<2 + 1 <<1; /*0000 0000 1111 0110*/ ;
int b = a << 8; /* a um 8 nach links verschoben: 1111 0110 0000 0000 */
int c = 1<<7 + 1<<5 + 1<<1 + 1; /*0000 0000 1010 0011*/
int d = b | c; /* bitweise geodert, 1111 0110 1010 011. In diesem Fall wäre auch */
int e = b + c; /* möglich, weil es keine Überschläge gibt.*/



Man kann es gar nicht laut genug schreien: Bit-Ausdrücke, d.h. Ausdrücke, die mit |, &, ~, << oder >> gebildet werden, und numerische Ausdrücke (mit +, -, *, /, %) dürfen nur mit allergrößter Vorsicht gemischt werden! Das sind verschiedene Welten, Übereinstimmungen sind rein zufällig. Wenn man das zur unbedachten Routine werden läßt, dann sind Programmierfehler die sichere Folge.

Die Ausdrücke b|c und b+c sind hier nur deshalb austauschbar, weil es keine Bits gibt, die in beiden Variablen 1 sind. Auch die Initialisierung oben (int a = ....;) ist eigentlich schon falsch, die + gehören durch | ersetzt.

Früher gabs auch mal den beliebten Optimierungstrick, bei Multiplikationen oder Divisionen mit Zweierpotenzen nicht zu rechnen, sondern den Schiebe-Operator anzuwenden.

Heutzutage beherrschen die Compiler so was besser als die Programmierer, so daß solche Tricks absolut nichts mehr bringen und nur noch den Algorithmus verschleiern, den nächsten Entwickler, der den Sourcecode lesen muß, hinters Licht führen und für unerwartete Seiteneffekte sorgen, falls die beteiligten Variablen mal von unsigned auf signed umdeklariert werden.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: