数组中的位移和写入另一个数组的得分

时间:2017-06-03 17:27:24

标签: c++ c bit

我将方法写入数组中的一位移位并保存到第二个数组。让我解释下面的例子:

 unsigned int firstNumber[2]  = { 0x00000001, 0x8FFFFFFF };
 unsigned int resultNumber[2];

结果应该是:

unsigned int resultNumber[2] = { 0x00000000, 0xC7FFFFFF };

下面是我的功能:

void bitShiftByOneInRight_1(unsigned int firstNumber[2], unsigned int resultNumber[2]) 
{
    unsigned int lastBitEnabled = 0;
    unsigned int mask = 1;

    for (unsigned int i = 0; i < 2; i++) {
        resultNumber[i] = 0;
        //  example        11001101 & 00000001 for uint8_t
        unsigned int lastBit = (firstNumber[i] & mask) << (sizeof(unsigned int)*8 - 1);

        resultNumber[i] = firstNumber[i] >> 1;
        resultNumber[i] = firstNumber[i] | lastBitEnabled;
        lastBitEnabled  = lastBit;
    }
}

我得到的答案是同一个数组firstNumber [2]:

unsigned int resultNumber[2] = { 0x00000001, 0x8FFFFFFF };

简单的例子,我们有数组:  [0b00000001, 0b01111111]然后回答应该是  [0b00000000, 0b10111111]

此外,当函数是这种形式时,这意味着使用一个参数作为输入和输出方法,正常工作:

void bitShiftByOneInRight(unsigned int firstNumber[2]) {
    unsigned int lastBitEnabled = 0;
    unsigned int mask = 1;

    for (unsigned int i = 0; i < 2; i++) {

        //  example         11001101 & 00000001 for uint8_t
        unsigned int lastBit = (firstNumber[i] & mask) << (sizeof(unsigned int)*8 - 1);

        firstNumber[i] = firstNumber[i] >> 1;
        firstNumber[i] = firstNumber[i] | lastBitEnabled;
        lastBitEnabled = lastBit;
    }

}

任何人都知道我弄错了什么? 每个答案都欢迎我!感谢

3 个答案:

答案 0 :(得分:1)

类似的东西:

#include <stdio.h>

void shift_right(unsigned *dst, unsigned *src, size_t len) {
  if (len == 0) return;
  for (size_t i = len - 1; i > 0; i--) 
    dst[i] = (src[i] >> 1) + (src[i - 1] & 1u) * ~(~0u >> 1);
  dst[0] = src[0] >> 1;
}

int main(void) {
  unsigned int firstNumber[]  = { 0x00000001u, 0x8FFFFFFFu }, secondNumber[2];
  shift_right(secondNumber, firstNumber, 2);
  printf("%08x, %08x", secondNumber[0], secondNumber[1]);
}

可以使用源和目标作为相同的数组调用它。

适用于unsigned的所有宽度。

虽然有些人会对使用乘法产生疑问,但事实证明gcc在将这个优化为一个移位时做了很好的工作,并且添加了与vicatcu @s基本相同的内容,但是自动调整了宽度。

答案 1 :(得分:0)

#include <stdio.h>
#include <stdint.h>

void shift_right(uint32_t *dst, uint32_t *src, size_t len) {
  if (len == 0) return;
  for (size_t i = len - 1; i > 0; i--){
    dst[i] = (src[i] >> 1) | (src[i-1] << 31);
  }  
  dst[0] = src[0] >> 1;
}

答案 2 :(得分:0)

您是否采用了一个参数形式并对其进行调整以使其具有单独的输入和输出参数?仔细看看这两行,他们一眼就看不到你的想法。

    resultNumber[i] = firstNumber[i] >> 1;
    resultNumber[i] = firstNumber[i] | lastBitEnabled;