Здрастьте! Вопрос такой: Есть два массива unsigned char a[32]; unsigned char b[128]; Мне надо на с++ сделать так, чтобы с начал копировалость с лева на право частями, каждая не char а int и так 3 раза, а 4й раз с права налево 1 раз. На асме это так: Код (Text): a BYTE 32d dup(?) b BYTE 128d dup(?) mov esi,offset a mov edi,offset b mov ecx,3d @@: push ecx mov ecx,8d rep movsd pop ecx loop @B sub esi,4d mov ecx,8d @@: mov eax,dword ptr[esi] mov dword ptr[edi],eax sub esi,4d add edi,4d loop @B Делал так: Код (Text): unsigned char a[32]; unsigned char b[128]; int k=0 for(int i=0;i<=3;i++) { for(int j=0;j<=7;j- -) { static_cast<int>b[k] = static_cast<int>b[j]; k++; } } for(i=0;j>=0;j++) { static_cast<int>b[k] = static_cast<int>b[j]; k++; } Но меня не поняли! )) Не удивительно, но почему, но как же на С++ написать такую вещь?
Код (Text): union { unsigned int d_word[8]; unsigned char b_yte[32]; } a; union { unsigned int d_word[32]; unsigned char b_yte[128]; } b; for(int k = 0;k <= 2;k++) { for(int i = 0;i <= 7; i++) { b.d_word[j] = a.d_word[i]; j++; } } for(int i = 7;i >= 0; i--) { b.d_word[j] = a.d_word[i]; j++; } Решение нашел, но мне не нравится то, что union, это же из Си, а не с++. Наверняка есть методы чисто для с++
Если я правильно понял задание, то могу предложить такой вариант Код (Text): unsigned char a[32], b[128]; for(long i=0; i<3*8; i++) ((unsigned long *)b)[i] = ((long *)a)[i%8]; for(long i=3*8; i<4*8; i++) ((unsigned long *)b)[i] = ((long *)a)[7 - i%8];
EvilsInterrupt думаю использование union даёт наиболее элегантный код типа так - комбиируя ваше решение с решением K_O_T Код (Text): union { char achar[32]; int aint[32 /(sizeof(char)*4)]; }a; union { char bchar[128]; int bint[128 /(sizeof(char)*4)]; }b; for (int i= 0 ;i<3*8;i++) b.aint[i]=a.aint[i% 8]; for (int i= 3*8 ;i<4*8; i++) b.aint[i]=a.aint[7-i%8];