Hey
Wer mich kennt weiß das ich gerne mit bit operationen rumspiele Auch jetzt probiere ich wieder etwas lustiges aus.
Ich möchte zwei bytes boxweise rotieren, sowohl gegen als auch im Uhrzeigersinn.
Hier ein Bild zur Erklärung:
Ich bin mir noch nicht ganz sicher wie ich das am besten Anstelle.
Bspw, gehen wir davon aus das ich gegen den Uhrzeigersinn rotieren möchte.
Ich würde alle bits im oberen byte nach links schieben. Das byte links müsste ich mir merken. Aber wie kann ich mir
die Position jedes alten bytes merken ohne ewig viele Variablen anzulegen. hat jemand einen Denkanstoß?
EDIT: Ich habe es geschafft eine Box (die ganz links) erfolgreich zu rotaten, allerdings ist mein Code sehr umständlich, und ich bin mir sicher das man sowas elegant in einem 2-zeiler oder so lösen kann.
Außerdem habe ich noch keinen Plan wie man das auf die anderen boxen anwendet ohne jedes Bit manuell zu testen und neu zu setzen...
Wer mich kennt weiß das ich gerne mit bit operationen rumspiele Auch jetzt probiere ich wieder etwas lustiges aus.
Ich möchte zwei bytes boxweise rotieren, sowohl gegen als auch im Uhrzeigersinn.
Hier ein Bild zur Erklärung:
Ich bin mir noch nicht ganz sicher wie ich das am besten Anstelle.
Bspw, gehen wir davon aus das ich gegen den Uhrzeigersinn rotieren möchte.
Ich würde alle bits im oberen byte nach links schieben. Das byte links müsste ich mir merken. Aber wie kann ich mir
die Position jedes alten bytes merken ohne ewig viele Variablen anzulegen. hat jemand einen Denkanstoß?
EDIT: Ich habe es geschafft eine Box (die ganz links) erfolgreich zu rotaten, allerdings ist mein Code sehr umständlich, und ich bin mir sicher das man sowas elegant in einem 2-zeiler oder so lösen kann.
Außerdem habe ich noch keinen Plan wie man das auf die anderen boxen anwendet ohne jedes Bit manuell zu testen und neu zu setzen...
Quellcode
- public static void Main(string[] args)
- {
- byte a = 123; // 0111 1011
- byte b = 234; // 1110 1010
- Console.WriteLine(Convert.ToString(a, 2));
- Console.WriteLine(Convert.ToString(b, 2));
- BoxFlip(a, b);
- Console.ReadKey();
- }
- private static void BoxFlip(byte a, byte b)
- {
- // Process last box, check what bits are set;
- bool topleft = (a & (1 << 7)) != 0;
- bool bottomleft = (b & (1 << 7)) != 0;
- bool bottomright = (b & (1 << 6)) != 0;
- bool topright = (a & (1 << 6)) != 0;
- // Set bits in last box to 0
- a &= 0b00111111;
- b &= 0b00111111;
- // Update topleft
- if (topright)
- {
- a |= (1 << 7);
- }
- else
- {
- a = (byte) (a & (~(1 << 7)));
- }
- // Update bottomleft
- if (topleft)
- {
- b |= (1 << 7);
- }
- else
- {
- b = (byte) (b & (~(1 << 7)));
- }
- // Update bottomright
- if (bottomleft)
- {
- b |= (1 << 6);
- }
- else
- {
- b = (byte) (b & (~(1 << 6)));
- }
- // Update topright
- if (bottomright)
- {
- a |= (1 << 6);
- }
- else
- {
- a = (byte) (a & (~(1 << 6)));
- }
- Console.WriteLine("Last Box Rotated:");
- Console.WriteLine(Convert.ToString(a, 2));
- Console.WriteLine(Convert.ToString(b, 2));
- }
- }
C# Developer
Learning C++
Learning C++
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()