Eingereich von Shalec (samt Beispiel):
#####
Zunächst arbeiten wir mit unsigned integern und wollen einen beliebig langen Array diesen Datentyps um n-Bits Shiften bzw. rotieren.
Da das Shiften/Rotieren schnell und einfach programmiert werden kann, besteht folgende weitere Schwierigkeit: The most efficient way!
Gebt dazu die Hardwarearchitektur und ausgenutzte Operationen an (falls notwendig) und den Code.
Implementiert auch die Tiks/Cycle Analysemethode.
Ein kurzes Beispiel (Natürlich nicht most efficient) und ohne Cycleanalyse.
Ausgabe:
#####
Zunächst arbeiten wir mit unsigned integern und wollen einen beliebig langen Array diesen Datentyps um n-Bits Shiften bzw. rotieren.
Da das Shiften/Rotieren schnell und einfach programmiert werden kann, besteht folgende weitere Schwierigkeit: The most efficient way!
Gebt dazu die Hardwarearchitektur und ausgenutzte Operationen an (falls notwendig) und den Code.
Implementiert auch die Tiks/Cycle Analysemethode.
Ein kurzes Beispiel (Natürlich nicht most efficient) und ohne Cycleanalyse.
Code:
/*
der Code wurde von mir etwas umgestaltet und vereinfacht
CDW
*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define N 22
typedef uint32_t array[N];
void lshift(array A, uint8_t k){
if (sizeof(A[0]) * CHAR_BIT <= k) {
fpurge(stdout);
fprintf(stderr, "Lshift not implemented for k >= %zu \n",
sizeof(A[0]) * CHAR_BIT);
exit(EXIT_FAILURE);
}
for(size_t i=0; i < N-1; ++i){
A[i] = (uint32_t) ((A[i] << k) | (A[i+1] >> (32-k)) );
}
A[N-1] = (uint32_t) (A[N-1] << k);
}
void dump_array(array A, char* fmt) {
for (size_t i = 0; i < N; ++i) {
printf(fmt, A[i]);
}
}
int main(){
array A = {
0xc22b4d0c, 0x4054bfb9, 0x1a0830ab, 0xb0a8771f, 0xd0d90c56, 0x58652c7f,
0x60b79d15, 0x35dd1ddd, 0xea2b70bc, 0x52131a21, 0x1930f, 0xc22b4d0c,
0x4054bfb9, 0x1a0830ab, 0xb0a8771f, 0xd0d90c56, 0x58652c7f, 0x60b79d15,
0x35dd1ddd, 0xea2b70bc, 0x52131a21, 0x1930f
};
uint8_t bits_to_shift = 12;
puts("Input:\n");
dump_array(A, "%08X ");
lshift(A, bits_to_shift);
printf("\nafter lshift(%u):\n", bits_to_shift);
dump_array(A, "%08X ");
return EXIT_SUCCESS;
}
Code:
Input:
C22B4D0C 4054BFB9 1A0830AB B0A8771F D0D90C56 58652C7F 60B79D15 35DD1DDD EA2B70BC 52131A21 0001930F C22B4D0C 4054BFB9 1A0830AB B0A8771F D0D90C56 58652C7F 60B79D15 35DD1DDD EA2B70BC 52131A21 0001930F
after lshift(12):
B4D0C405 4BFB91A0 830ABB0A 8771FD0D 90C56586 52C7F60B 79D1535D D1DDDEA2 B70BC521 31A21000 1930FC22 B4D0C405 4BFB91A0 830ABB0A 8771FD0D 90C56586 52C7F60B 79D1535D D1DDDEA2 B70BC521 31A21000 1930F000