如何对一组int进行bithift?

时间:2017-07-09 04:01:50

标签: c arrays

我有一个大小为50的int数组和第一个49'插槽'填充,我想将数组的49个元素中的每一个移动一个位置,以便数组中的第一个元素现在是空闲的。

有没有办法将整个数组的位移位32位?像:

  

array [0]>(49)> 32;

一些随意编写的符号...但我希望它传达了我正在寻找的东西

2 个答案:

答案 0 :(得分:0)

如果你想走很远的路......

#include <stdio.h>

int main(void)
{
    int array_size = 5;
    int array[] = {5, 1, 2, 3, 4};
    int i;
    for (i = array_size - 2; i >= 0; i--)
    {
        array[i+1] = array[i];

        if (i == 0)
            array[i] = 0; //whatever you want
    }

    // not necessary, just print the change
    int j;
    for (j = 0; j < array_size; j++)
        printf("%d ", array[j]);
    printf("\n");

    return 0;
}

答案 1 :(得分:0)

正如@COLDSPEED在评论中建议的那样,memmove与你期望的非常接近。

void *memmove(void *str1, const void *str2, size_t n)

注意n是要移动的字节总大小。从移动32位开始,你可能想为1 int腾出空间。 (int的大小取决于机器)。因此,使用memmove,您可以移动1个字节。不是1位。

memmove的主要目的只是复制。因此,它不应该比直接复制更好。两者都应该花费O(n)次。

传统方法:

for (i = 5; i > 0; i--)
    arr[i] = arr[i-1];
arr[0] = 5;

以下是一个示例代码,使用memmove做同样的事情:

#include <stdio.h>
#include <string.h>

int main ()
{
    int i;
    int arr[5] = {1, 2, 3, 4};

    // Printing before state
    for (i = 0; i < 4; i++)
        printf ("%d ", arr[i]);
    printf ("\n");

    // The shift operation
    memmove(arr+1, arr, 4*sizeof(int));

    // Inserting at the beginning
    arr[0] = 5;

   // Printing after state
   printf("After memmove:\n");
   for (i = 0; i < 5; i++)
        printf ("%d ", arr[i]);
    printf ("\n");

   return 0;
}

输出:

1 2 3 4 
After memmove:
5 1 2 3 4

如果您想了解有关mmove:memmove-in-c/c++

的更多信息,请参阅以下文章