gpt4 book ai didi

c - 凌乱的代码从下一个元素中删除了第一位追加

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:04 26 4
gpt4 key购买 nike

我编写这段代码是为了删除第一个位,然后从下一个元素追加位。这里的问题是,由于发生了所有移位,第 8 个元素全为零。这段代码很难看,但我认为它有效。我只是想知道是否有人可以提出更好的方法,以及我将如何删除每八个元素出现的那个零元素。

提前谢谢你。

注意* 只编码了 6 周 :P

#include "stdio.h"
#include "stdlib.h"

int main(void)
{
unsigned char copy;
int i, j, n;
int shiftright;
int shiftleft;
shiftright = 6;
shiftleft = 2;

int counter = 0;
printf("Enter a number of values to test: ");
scanf("%d", &n);
unsigned char* array = malloc(n * sizeof(unsigned char));

copy = 0b01111111;
printf("Initial Array:\n");
for (i = 0; i < n; i++)
{
array[i] = copy;
printf("%x ", array[i]);
}

printf("\n");
// magic starts happening here
i = 0;
array[i] <<= 1;
for (j = 0; j < n; j++)
{
// counter to check for the 8th element
if (counter == 7)
{
counter = 0;
j++;
array[j] <<= 1;
}
counter++;
printf("sweep: %d\n", j);
// bitwise operations to remove zeros and append bits together
for (i = j; i < j + 1; i++)
{
if (array[i] == 0)
{
i++;
j++;
}
copy = array[i + 1];
copy >>= shiftright;
array[i] |= copy;
array[i + 1] <<= shiftleft;
shiftright--;
shiftleft++;
if (shiftright == -1)
{
shiftright = 6;
}
if (shiftleft == 9)
{
shiftleft = 2;
}
for (i = 0; i < n; i++)
{
printf("%x ", array[i]);
}
}
printf("\n");
}
return 0;
}

最佳答案

找到较低有效位使用:

int least = num&1;

要找到最重要的,请使用 Warren 的解决方案来解决 32 位 int 中最左边的设置位 - 他将此例程称为 flp2:

 uint32_t flp2(uint32_t x)
{
x |= (x >> 1);
x |= (x >> 2);
x |= (x >> 4);
x |= (x >> 8);
x |= (x >> 16);
return x - (x >> 1);
}

用这两个你可以做:

int lastMostSig = 0;

for(j= 0 ; j < n; j++)
{
array[i] = array[i] - (array[i] % 2);
array[i] += lastMostSig;
lastMostSig = flp2(array[i]);
array[i] = array[i]<<1;
array[i] = array[i]>>1;
}

关于c - 凌乱的代码从下一个元素中删除了第一位追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com