Rotierender bits der eine ganze Zahl in C
Pass eine ganze Zahl 2 zu dieser Funktion und dann wieder ein integer ist 4
x = 2;
x = rotateInt('L', x, 1);
(Links verschiebt die bits von 1)
Beispiel:
00000010 -> drehen Sie nach Links um 1 -> 00000100
aber wenn ich diese übergeben:
x = rotateInt('R', x, 3);
wird es wieder 64, 01000000
Hier ist der code, kann jemand den Fehler korrigieren... danke
int rotateInt(char direction, unsigned int x, int y)
{
unsigned int mask = 0;
int num = 0, result = 0;
int i;
for (i = 0; i < y; i++)
{
if (direction == 'R')
{
if ((x & 1) == 1)
x = (x ^ 129);
else
x = x >> 1;
}
else if (direction == 'L')
{
if ((x & 128) == 1)
x = (x ^ 129);
else
x = x << 1;
}
}
result = (result ^ x);
return result;
}
- Betrachten >> und <<, vielleicht. Jetzt schreiben die Funktion 🙂
- Und Ihre Frage ist? Sie möchten wissen, bitweise Operationen? en.wikipedia.org/wiki/...
- Sie wirklich brauchen, um zu lernen, zum Einrücken von code. Es macht den code sehr viel besser lesbar. Plus Sie arbeiten schneller und machen weniger Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, ich nehme an, Sie wissen, was rechts und Links verlagert werden. Und Sie wissen, dass den Unterschied zwischen arithmetischen und logischen shifts.
C nur arithmetische Verschiebungen. Es nicht, logisch, Schichten, noch tut Sie dreht. okay, ich habe gelogen, mit C ist das logische Schichten auf unsigned ints.
Drehen tut, na ja, genau das: es ist das gleiche wie ein logischer shift, außer wenn Sie die Verschiebung über das Ende der Zahl, die Ziffern "wrap-around" auf die andere Seite. Zum Beispiel
0010
rechts gedreht ist0001
. Wenn Sie mit der rechten Maustaste erneut drehen, erhalten Sie1000
. Siehe, die1
gewickelt, gedreht oder, auf der anderen Seite der integer.Links drehen ist ähnlich:
0100
Links drehen1000
Links drehen0001
Links drehen0010
etc.Beachten Sie, dass dreht sich nicht halten Sie das Vorzeichen-bit, die als ein arithmetischer rechts-shift würde.
So, C nur arithmetische Verschiebungen. So setzen Sie die "rotate" - Teil manuell. Also, nehmen Sie ein Links-drehen. Sie möchten:
Sollten Sie in der Lage sein, um herauszufinden, eine ähnliche Methode für rechts dreht.
Glück!
Die akzeptierte Antwort ist sehr nett und unkompliziert.
Allerdings war ich dabei einige K&R übungen zum auffrischen meiner C, und wollte dies teilen drehen-um-die-richtige-Funktion, die nützlich für Menschen, die versuchen zu lernen, bit-Weise Operationen.
Für Links-Rotationen geben Sie nur Werte zwischen -1 und -31 des
bitAmount
argument.Tun, beachten Sie, dass diese Funktion begünstigt Lehr - /Lesbarkeit/Einfachheit über Effizienz/Portabilität/Kompaktheit.
bit_width = sizeof(inputWord) * 8;
Haben Sie einen Blick auf die bitweise shift-Operatoren:
http://en.wikipedia.org/wiki/Bitwise_operators#Shifts_in_C.2C_C.2B.2B_and_Java
Scheint es, wie Ihre drehen nach rechts ist RICHTIG. 1 fiel auf die Seite und kehrte wieder zurück von der linken?
Anyway, hier sind die Zutaten:
http://tigcc.ticalc.org/doc/keywords.html#if - für die Feststellung, ob es ist 'L' oder 'R'
http://tigcc.ticalc.org/doc/keywords.html#for - für die Zählung der Anzahl der Zeiten zu verschieben
und
http://msdn.microsoft.com/en-us/library/f96c63ed(VS.80).aspx - tatsächlich zu verschieben
Gehen, mit ihm zu spielen. Es WIRD funktionieren, irgendwann!
Da niemand sagte Ihnen, wie Sie diese umsetzen, können Sie die systeminterne Funktionen, die für visual studio-Sie sind _rotl, _rotl64, _rotr, _rotr64.
Oh, aber rotation und Verschiebungen sind 2 verschiedene Dinge!
Ich empfehle eine
unsigned int
.&
Maskierung: die Verschiebung wird automatisch bits wegzuwerfen, dass der Herbst sich dem Ende.return dir == DIR_RIGHT ? (in >> amount) | (in << (8*sizeof(unsigned int) - amount)) : (in << amount) | (in >> (8*sizeof(unsigned int) - amount));