Nếu bạn đang tìm kiếm giải pháp C thuần túy, tại đây, bao gồm chương trình điều khiển. Hóa ra là khá đơn giản: để xoay bởi n
, bạn:
- đảo ngược
n
yếu tố đầu tiên tại chỗ,
- đảo ngược các yếu tố còn lại tại chỗ, và
- đảo ngược toàn bộ mảng trong -địa điểm.
Điều này yêu cầu một phần tử đáng giá thêm bộ nhớ (để đảo ngược).
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
/* print an array */
static void print_array(unsigned char *arr, size_t n, const char *prefix)
{
size_t i;
if (prefix) {
printf("%s: ", prefix);
}
for (i=0; i < n; ++i) {
printf("%02x ", (unsigned int)arr[i]);
}
printf("\n");
}
/* reverse 'arr', which has 'narr' elements */
static void reverse(unsigned char *arr, size_t narr)
{
size_t i;
for (i=0; i < narr/2; ++i) {
unsigned char tmp = arr[i];
arr[i] = arr[narr-i-1];
arr[narr-i-1] = tmp;
}
}
/* rotate 'arr' of size 'narr' by 'shift' */
static void rotate(unsigned char *arr, size_t narr, unsigned long shift)
{
reverse(arr, shift);
reverse(arr + shift, narr - shift);
reverse(arr, narr);
}
/* driver program */
int main(int argc, char *argv[])
{
unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9,10};
size_t narr = sizeof arr/sizeof arr[0];
unsigned long shift = 2;
if (argc > 1) {
char *eptr;
shift = strtoul(argv[1], &eptr, 0);
if (*eptr || errno == ERANGE) {
perror("strtoul");
return EXIT_FAILURE;
}
}
print_array(arr, narr, "before shift");
rotate(arr, narr, shift);
print_array(arr, narr, "after shift");
return EXIT_SUCCESS;
}
Nguồn
2009-12-15 03:04:27
Bạn đang cố gắng thực hiện điều gì, sao chép mảng? –
Có lẽ nó chỉ là tôi, nhưng tôi là một chút không rõ ràng - bạn có muốn bitwise thay đổi mỗi phần tử trong mảng, hoặc thay đổi tròn toàn bộ mảng? – maxaposteriori
Bạn có đang dịch chuyển các phần tử mảng, tức là arr [0] = arr [1], vâng, hay bạn đang bithifting từng phần tử của mảng, tức là arr [0] = arr [0] << 2? Nếu trước đây, hãy xóa thẻ "bitwise". – mch