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

标签 c logic bit-manipulation

我编写这段代码是为了删除第一个位,然后从下一个元素追加位。这里的问题是,由于发生了所有移位,第 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/

相关文章:

c++ - 访问外部进程的内存

c - 如何在 FreeBSD 中调试 malloc/memleaks

c - 在像 C 这样的编程语言的上下文中,数组数据结构和数组数据类型有什么区别?

optimization - 将整数除以 3 的最快方法是什么?

c++ - 位左移

c - 打开、读取和打印二维数组! (我的代码有什么问题吗?)

ruby - 假设每天都运行备份,如何仅使用 100 个备份副本来保留过去 1 年的备份?

java - 无法将伪代码翻译为java

mongodb - MongoDB官方GoLang驱动程序比较运算符

c - 你如何使用 C 确定数字的二进制表示中是否有偶数 1?