上进行换档动作最佳方式假设我有一个数组到一个数组
unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9};
是否有除了刚才复制他们都到另一个阵列对其执行移位操作的方式。我们可以使用链表轻松地做到这一点,但我想知道我们是否可以使用移位操作符并更快地完成工作。
注意:这个问题中的数据只是一个例子。答案应该与数组中的数据无关。
上进行换档动作最佳方式假设我有一个数组到一个数组
unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9};
是否有除了刚才复制他们都到另一个阵列对其执行移位操作的方式。我们可以使用链表轻松地做到这一点,但我想知道我们是否可以使用移位操作符并更快地完成工作。
注意:这个问题中的数据只是一个例子。答案应该与数组中的数据无关。
如果你想在元素的循环移位:
std::rotate(&arr[0], &arr[1], &arr[10]);
...会做的伎俩。你需要#include算法头。
快速链接http://www.cplusplus.com/reference/algorithm/rotate/ – wardw 2013-04-16 19:16:55
快速链接http://en.cppreference。com/w/cpp/algorithm/rotate – 2015-02-05 10:58:46
如果你是唯一一个有数组指针的人,只需递增指针并减少长度。
只要记住当你释放它时保持原来的指针。
只要阵列是可以修改的,你可以使用的memmove转移他们(但不要错误地使用memcpy作为的memcpy并不意味着重叠的区域):
memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr));
(的sizeof(ARR) - sizeof(* arr)是数组中除1个元素以外的所有字节的大小)。
我不知道你是否应该使用std :: valarray。
如果你真的想要BLAZING速度看看带进位操作的汇编器转换。 http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions 与循环结合,您可以以毫秒为单位移位数组。
@Jay:谢谢你..请记住这一点 – tomkaith13 2009-12-14 20:46:30
毫秒!?哎 – ysth 2009-12-15 06:07:16
如果您正在寻找纯粹的C解决方案,那么它就是包括一个驱动程序。它原来是非常简单的:由n
旋转,您:
n
元素,这需要额外存储一个元素(用于反转)。
#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;
}
@Alok:感谢这个人......看起来真的很有帮助 – tomkaith13 2009-12-15 19:19:38
你想完成什么,复制数组? – 2009-12-14 20:15:32
也许这只是我,但我有点不清楚 - 你想要按位移动数组中的每个元素,还是循环移动整个数组? – maxaposteriori 2009-12-14 20:16:57
你是否在移动数组的元素,即arr [0] = arr [1]等,或者你是否移位数组中的每个元素,即arr [0] = arr [0] << 2?如果前者,删除“按位”标签。 – mch 2009-12-14 20:22:00