【发布时间】:2018-12-03 03:07:14
【问题描述】:
很短,我在理解这段代码的工作原理时遇到了问题,它比我的 20 行左右的代码更有效地获得相同的结果。我了解左移应该如何工作以及按位或,但希望得到一些指导,以了解两者如何结合在一起以使 for 循环中的行工作。 代码旨在接收给定大小(计数)的位(位)数组并返回位的整数值。
unsigned binary_array_to_numbers(const unsigned *bits, size_t count) {
unsigned res = 0;
for (size_t i = 0; i < count; i++)
res = res << 1 | bits[i];
return res;
}
编辑:根据要求,我的新手解决方案仍然通过了所有测试:添加是可能分配给 bits[] 的示例
unsigned binary_array_to_numbers(const unsigned *bits, size_t count)
{
int i, j = 0;
unsigned add = 0;
for (i = count - 1; i >= 0; i--){
if(bits[i] == 1){
if(j >= 1){
j = j * 2;
add = add + j;
}
else{
j++;
add = add + j;
}
}
else {
if( j>= 1){
j = j * 2;
}
else{
j++;
}
}
}
return add;
}
void main(){
const unsigned bits[] = {0,1,1,0};
size_t count = sizeof(bits)/sizeof(bits[0]);
binary_array_to_numbers(bits, count);
}
【问题讨论】:
-
你能显示一个示例调用吗?也许你的 20 行?
-
根据请求编辑。
-
两张反对票?也许我不明白这个网站应该如何运作?我认为堆栈溢出是针对特定代码相关的问题。这篇stackoverflow.com/questions/141525/… 的帖子是历史悠久的经典之作,获得了 1230 次赞成票,本质上是“位移如何工作?”可以在许多其他地方找到答案的一般问题。我发布了一个特定的用例,为什么不赞成?
-
你确定是
unsigned res = 0; -
是的,它是 CodeWars 上 C katas 之一的排名第一的答案。当您在那里提交答案时,它会经过非常彻底的测试以通过所有边缘情况。刚刚意识到我在测试期间将返回类型更改为int,只是将其更改回来,我已经仔细检查了代码是否与原始答案相同。
标签: c bit-manipulation bit-shift