我试图使一个函数接受16位作为参数,并且只返回其中的偶数位(甚至作为索引),基本上应该返回8位。
例如,如果我们有:yxyx yx yx yx yx yx yx;
函数应返回:xxxx-xxxx;
我迷路了,但我开始是:

unsigned char function(unsigned short int p){
   unsigned char q=0;
   for(int i=15;i>=0;i--){
      if(i%2==0){
         //now we have somehow to take that bit because it has an even index
      }
   }
return q;
}

你能帮我完成这个吗?

最佳答案

写下这种算法有多种方法。在这里,我要用最容易理解的。但首先,让我们更改函数的签名以使用正确的类型:

#include <stdint.h>

uint8_t function(uint16_t p);

我们将16位无符号整数转换为8位整数,因此以上是推荐的签名。现在来看看算法。
中心思想是将要提取的位放在最右边,这样我们就可以使用& 1,它将除第一个位以外的所有位归零。这:
uint8_t right_most_bit = p & 1;

会给我们那一点。现在我们要将该位存储在q中的正确位置。会有一些指数。所以:
q = q | (right_most_bit << i);

或者简单地说:
q |= (right_most_bit << i);

然后我们需要把下一个放在下一个i位后面的最右边的位置。我们这样做是因为:
p = p >> 2;

或更短:
p >>= 2;

所以这就给我们留下了创建循环的问题,这样我们的p在每次迭代中增加1。循环应该在i为0时结束,因为我们知道不会有更多的位要提取。这样做的好处是,循环将只在所需迭代次数最少的情况下运行。所以
for (unsigned i = 0; p != 0; i++)

我们把这些放在一起:
for (unsigned i = 0; p != 0; i++) {
    uint8_t right_most_bit = p & 1;
    q |= (right_most_bit << i);
    p >>= 2;
}

当然,您可以进一步简化:
for (unsigned i = 0; p != 0; i++, p >>= 2) {
    q |= ((p & 1) << i);
}

总而言之:
uint8_t function(uint16_t p)
{
    uint8_t q = 0;

    for (unsigned i = 0; p != 0; i++, p >>= 2) {
        q |= ((p & 1) << i);
    }
    return q;
}

关于c - 仅返回单词中偶数位的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56589651/

10-13 07:34