我试图使一个函数接受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/