按位移动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字符数组的位右移1,将右移的位移回数组的最左侧,与另一个相同大小的数组进行逐位比较。

从技术上讲,比较不必是数组的数组……我只需要比特。 在尝试进行转换/比较之前,将数组转换为其他内容会更容易吗?

你必须转移和比较元素。

 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; } 

因为您需要来自下一个更高插槽的位,所以在另一个方向上遍历该arrays。

 /** 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. } } } 

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

如果你希望每个焦点移出的位都会转移到下一个焦点,你也需要手动处理它。

如果你想要转换到下一个字节的行为,并且不介意使你的代码变得令人讨厌和不可移植并且容易出错,那么你可能能够获取指向数组的指针,将其转换为unsigned long long * ,取消引用它并移动生成的整数,然后再将其存储回来。

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

(如果你可以说更多关于你实际想要实现的目标,那么可能会有更多有用的答案。)

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

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

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

此外,您必须小心使用字符,因为它们通常是有符号的,而包含负值的字符将从左侧带来“1”而不是零。 所以你最好使用unsigned chars。

编辑:上面的代码是简单的。 如果您打算将数组作为一个整体向右移动,而不仅仅是每个字节本身,那么您需要“手动”将每个LSB复制到其右侧字节的MSB。 在Richard Pennington的回答中循环一下。

 /** * shift a number of bits to the right * * @param SRC the array to shift * @param len the length of the array * @param shift the number of consecutive bits to shift * */ static void shift_bits_right(uint8_t SRC[], uint16_t len, uint32_t shift) { uint32_t i = 0; uint8_t start = shift / 8; uint8_t rest = shift % 8; uint8_t previous = 0; for(i = 0; i < len; i++) { if(start <= i) { previous = SRC[i - start]; } uint8_t value = (previous << (8 - rest)) | SRC[i + start] >> rest; SRC[i + start] = value; } }