2012-04-28 41 views
9

我有一个字符数组,我试图按位右移>>,然后&与另一个数组。我想我对如何做到这一点有错误的想法。char的按位移数组

我想,即使它是个字符只是陈述my_array >>= 1的阵列将转移的一切,但我得到了一个错误:"error: invalid operands to binary >> (have ‘char[8]’ and ‘int’)"

按位比较,我试图做的是开始对所有类似大小的数组“0”...因为我得到:"error: invalid operands to binary & (have ‘char *’ and ‘char *’)"

我需要将这些数组转换成别的东西,然后才能转移和比较吗?

对不起,我不是很清楚......所有伟大的建议,直到现在,我认为我越来越意识到,没有超级简单的方法来做到这一点。更具体地说,我想要做的是将WHOLE char数组的右侧位移1,将右移后的位添加到数组的左侧,并与另一个相同大小的数组进行按位比较。

从技术上说,比较并不一定要用数组排列......我只需要这些位。在尝试进行移位/比较之前将数组转换为其他数据会更容易吗?

+2

你想旋转数组的内容,还是试图按位移动数组中的每个单独的元素?这两种操作本身都不存在于C语言中。您需要编写一个循环,将每个元素复制到一个位置,或者逐位移动数组中的每个元素。 – chrisaycock 2012-04-28 21:27:17

回答

10

你得换和按元素进行比较。

for(i = 0; i < len; ++i) 
    array[i] >>= 3; 

例如。如果要移动的位移出一个元素的下一个,它更复杂,说你右移,然后

unsigned char bits1 = 0, bits2 = 0; 
for(i = len-1; i >= 0; --i) { 
    bits2 = array[i] & 0x07; 
    array[i] >>= 3; 
    array[i] |= bits1 << 5; 
    bits1 = bits2; 
} 

遍历其它方向的阵列,因为你从未来需要的位更高的插槽。

2

您必须逐个移动数组中的条目。 (如果你想比较其中两个,你需要逐个元素来完成它。)

如果你希望每个字符的位移动都会转移到下一个字符,你需要也要手动照顾。

如果你想要转入下一个字节的行为,并且不介意让你的代码变得讨厌,不便携,并且容易出错,那么你可以把指针指向数组,到unsigned long long *之类的东西,取消引用它并移动生成的整数,然后再次存储它。

但是,如果这是你想要的行为,那么你应该使用整数而不是char[8]开始。

(如果你能多谈谈你实际上旨在实现,那么更多的有用的答案是可能的。)

2

如果你想在数组上执行诸如移位/ OR/XOR/AND/etc等操作,你应该在循环中执行它,你不能直接在数组上执行它。

2

您只能移动该数组的成员,一个char(或一个int)。你不能移动整个数组。移动my_array尝试对不可能的数组类型(或指向char的指针)执行移位操作。而是执行此操作:

for (i = 0; i < size; i++) { 
    my_array[i] >>= 1; 
} 

你也必须小心地使用字符,因为它们通常签名,并包含一个负值的字符会从左边的零,而不是把“1”。所以你最好使用无符号的字符。

编辑: 上面的代码是简单的。如果您打算将整个阵列作为一个整体进行右移,而不是单独对每个字节进行右移,那么您需要“手动”将每个LSB复制到其右侧字节的MSB。在理查德彭宁顿的回答中循环。

+0

我假设他想将数组视为单个值,所以您需要从更重要的字节中进行一点操作。 – loganfsmyth 2012-04-28 21:37:15

+0

对,我编辑了我的答案。谢谢 – 2012-04-28 21:55:42

3
/** Shift an array right. 
* @param ar The array to shift. 
* @param size The number of array elements. 
* @param shift The number of bits to shift. 
*/ 
void 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. 
     } 
    } 
} 
+0

这个看起来很奇怪,或者我错过了一些东西。它看起来像是右移和左移的组合。进位位旁边的注释说“将元素左移一位”,但它右移。而for循环从高到低,我宁愿从低到高转向右侧。 – 2015-07-28 11:44:08

+0

另外我会移动“int carry = 0;”在for循环之前的while循环中。 – 2015-07-28 12:06:14