char数组的按位运算

时间:2014-05-07 05:18:47

标签: c arrays bit-manipulation bitwise-operators

所以我有一个数字的二进制表示作为字符数组。我需要做的是将此表示向右移动11位。

例如,

我有一个char数组,当前存储此字符串:11000000111001 在执行按位移位后,我会在它之前得到110并且有一些零。

我尝试使用此功能,但它给了我奇怪的输出:

char *shift_right(unsigned char *ar, int size, int shift)
{
int carry = 0;                              // Clear the initial carry bit.
while (shift--) {                           // For each bit to shift ...
    for (int i = size - 1; i >= 0; --i) {   // For each element of the array   from high to low ...
        int next = (ar[i] & 1) ? 0x80 : 0;  // ... if the low bit is set, set the carry bit.
        ar[i] = carry | (ar[i] >> 1);       // Shift the element one bit left and addthe old carry.
        carry = next;                       // Remember the old carry for next time.
    }
}
return ar;
}

对此的任何帮助都将非常感谢;如果我不清楚,请告诉我。

3 个答案:

答案 0 :(得分:2)

他们只是人物......

char *shift_right(unsigned char *ar, int size, int shift)
   {

   memmove(&ar[shift], ar, size-shift);
   memset(ar, '0', shift);

   return(ar);
   };

或者,将字符串转换为long-long,将其移位,然后返回字符串:

char *shift_right(char *ar, int size, int shift)
   {
   unsigned long long x;
   char *cp;

   x=strtoull(ar, &cp, 2);  // As suggested by 'Don't You Worry Child'
   x = x >> shift;
   while(cp > ar)
      {
      --cp;
      *cp = (1 & x) ? '1' : '0';
      x = x >> 1;
      }

   return(ar);
   };

答案 1 :(得分:0)

如果你真的想使用按位移位,那么就不能在字符串上进行。根本不可能!!

你必须将它转换为整数(使用strtol)然后按位移位。之后,将其转换回字符串(没有标准库函数,使用for循环)。

答案 2 :(得分:0)

我建议保持代码简单易读。

#include <stdio.h>
#include <stdlib.h>

void shift_right (char* dest, const char* source, int shift_n)
{
  uint16_t val = strtoul(source, NULL, 2);
  val >>= shift_n;

  for(uint8_t i=0; i<16; i++)
  {
    if(val & 0x8000) // first item of the string is the MSB
    {
      dest[i] = '1';
    }
    else
    {
      dest[i] = '0';
    }
    val <<= 1;    // keep evaluating the number from MSB and down
  }

  dest[16] = '\0';
}


int main()
{
  const char str [16+1] = "0011000000111001";
  char str_shifted [16+1];

  puts(str);
  shift_right(str_shifted, str, 11);
  puts(str_shifted);

  return 0;
}