上進行換檔動作最佳方式假設我有一個數組到一個數組
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