gpt4 book ai didi

C 位运算左移和按位或

转载 作者:行者123 更新时间:2023-11-30 20:18:33 26 4
gpt4 key购买 nike

很短,我在理解这段代码的工作原理时遇到了问题,它比我的 20 行左右的代码要高效得多,才能获得相同的结果。我了解左移和按位 Or 应该如何工作,但希望得到一些指导来了解两者如何结合在一起使 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;
}

编辑:根据要求,我的新手解决方案仍然通过了所有测试:添加了可能分配给位[]的示例

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

最佳答案

细目:

  • 二进制数的每次左移运算都会有效地相乘2 0111(7) << 1 = 1110(14)
  • 考虑 rhubarbdog 的答案 - 该操作可以被视为两个单独的操作。首先左移(乘以二),然后与当前正在检查的位进行“或”
  • PC 不区分显示的值和二进制数字的表示

让我们尝试查看一个案例,您的输入是:

bits = {0, 1, 0, 1};
count = 4;
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 // (a)
res = res | bits[i]; /* (b) according to rhubarbdog answer */
return res;
}

迭代0:
- 位[i] = 0;
- (a) res = b0; (左移0)
- (b) res = b0; (与 0 进行按位或)

迭代 1:
- 位[i] = 1;
- (a) res = b0; (左移0)
- (b) res = b1; (与 1 进行按位或)

迭代2:
- 位[i] = 0;
- (a) res = b10; (左移 1 - 小数值为 2)
- (b) res = b10; (与 0 进行按位或)

迭代3:
- 位[i] = 1;
- (a) res = b100; (左移 1 - 小数值为 4)
- (b) res = b101; (与 1 进行按位或)

res的最终结果正如人们所期望的那样,是二进制(101)和十进制(5)注意:使用unsigned是必须的,因为如果 MSB 为 1,则有符号值将被解释为负值。

希望有帮助...

关于C 位运算左移和按位或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53586943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com