Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Bitweise verschiebung

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 < [ 2 ]
000
10.10.2005, 20:45 Uhr
~Thomy
Gast


Hallo an alle,

mal eine Frage zur bitweisen Verschiebung.
also 100 << 2 macht ja:

aus 01100100 --> 10010000

es werden also von hinten nur Nullen nachgeschoben....

wie stellt man es jetzt aber an, dass die zeichen, die links verschwinden, links angehängt werden?

also:

aus 01100100 --> 10010001

?

MfG Thomy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.10.2005, 20:46 Uhr
~Thomy
Gast


Sry, ich meine, dass die Zeichen, die links verschwinden, <<rechts>> angehängt werden
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.10.2005, 21:16 Uhr
Pablo
Supertux
(Operator)


meinst du 100 >> 2 ?
was du als erstes meinstest ist link shift. Was du vermutlich willst ist rechts shift >>
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.10.2005, 21:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nein er meint das das was "rausgeschoben" wird wieder von rechts reinwandert. Jedoch gibts da imho nichts fertiges
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.10.2005, 21:32 Uhr
Pablo
Supertux
(Operator)


ach so, zyklisches shift. Ich denke, dazu gibt es keinen Operator.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.10.2005, 21:58 Uhr
ao

(Operator)



Zitat von Pablo:
ach so, zyklisches shift. Ich denke, dazu gibt es keinen Operator.

Stimmt, den gibts in Standard-C(++) nicht.
Da aber manche Prozessoren eine Cycle-Shift-Instruktion im Befehlssatz haben, unterstützen das eventuell auch die zugehörigen Compiler, meist aber nicht in Form eines Operators, sondern als Funktion. Ist aber plattform-spezifisch.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.10.2005, 22:01 Uhr
ao

(Operator)



Zitat von ~Thomy:
wie stellt man es jetzt aber an, dass die zeichen, die links verschwinden, links angehängt werden?

Muss man selber machen. Die Bits, die rausgeschoben werden, vorher rauskopieren und hinterher entsprechend runtergeschoben wieder reinkopieren.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.10.2005, 22:05 Uhr
~Thomy
Gast


Ok, and how to copy a bit?

Kann man überhapt sagen, z.B. 3 Bit sei 1 und 2 Bit sei 0, ...?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.10.2005, 22:13 Uhr
ao

(Operator)



Zitat von ~Thomy:
Ok, and how to copy a bit?

Ungefähr so (ungetestet hingekritzelt).
Ist auch nicht portabel, sondern für 32-Bit-Daten. Für andere Wortbreiten müsste die 0x80000000 angepasst werden.

C++:
unsigned csl (unsigned val, unsigned sh)    // csl = cyclic left shift
{
    while (sh--)
    {
        unsigned carry = val & 0x80000000;  // oberstes Bit merken
        val = (val << 1) | (carry ? 1 : 0); // schieben und oberstes Bit unten wieder reinkopieren
    }
    return val;
}


Wirkt vielleicht auf den ersten Blick sehr schlecht optimiert, in ner Schleife n-mal um 1 zu shiften. Aber erstens ist das Prinzip so einfacher zu durchschauen und zweitens, um in einem Schritt shiften zu können, muss man eine Maske mit n 1-Bits vorbereiten, um die rausgeschobenen Bits zu retten, d.h. ganz umsonst gibts das nicht.

ao

Dieser Post wurde am 10.10.2005 um 22:19 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.10.2005, 22:37 Uhr
Pablo
Supertux
(Operator)


Ohne Schleife und einigermassen Plattform unabhängig

wobei bits die Anzahl der bits eines ints (z.b. 32)


C++:
#include <math.h>

unsigned csl (unsigned val, unsigned sh, size_t bits)
{
    unsigned int mask = pow(2,sh) - 1;

    mask <<= bits - sh;

    mask &= val;

    mask >>= bits - sh;

    val <<= sh;

    val |= mask;

    return val;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 10.10.2005 um 22:40 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: