由于我是C的新手,我可能还不清楚如何正确使用移位运算符。 我写了这段代码:
#include <stdio.h>
#define SIZE 8
int main() {
int a[ SIZE ] = {0};
int i;
int x = 1;
int sum = 0;
for (i = (SIZE - 1); i >= 0; i--){
scanf("%d", &a[ i ]);
}
for (i = 0;i < SIZE;i++) {
if (x & a[ i ])
sum = sum + (i << 1);
else
sum = (sum + 0);
}
printf ("%d\n\n", sum);
return 0;
}
我对此代码的期望是,如果我在堆栈中输入此值:
0
0
0
0
0
0
1
1
它返回给我两个数组索引的幂的结果。 这将是索引0从一位向左移位到1而索引1从一位向左移位到2.
然后将值存储在sum变量中,一旦循环结束,printf给出总和,在这种情况下应为3。但返回的值是2。
如果我输入:
1
0
0
0
0
0
0
0
返回的值是14。
所以在我看来它只是乘以两个输入。我不明白我做错了什么。
答案 0 :(得分:0)
看起来你正在改变错误的方式。您应该sum = sum + (1 << i)
而不是sum = sum + (i << 1)
。后者仅将索引i
乘以2(即向左移1位)。
根据位域a中的第i个位置向左移1。以下代码也应简化您的代码。
#include <stdio.h>
#define SIZE 8
int main() {
int a[ SIZE ] = {0};
int i;
int sum = 0;
for (i = (SIZE - 1); i >= 0; i--){
scanf("%d", &a[ i ]);
}
for (i = 0;i < SIZE;i++) {
if (a[ i ])
sum = sum + (1 << i);
}
printf ("%d\n\n", sum);
return 0;
}
答案 1 :(得分:0)
说实话,我无法理解你的观点。你说“它返回给我两个数组索引的幂的结果。”但你也提到左移。你想要哪一个?
无论如何,下面的代码是你想要的吗?如果你说“是”,我会详细解释。
#include <stdio.h>
#define SIZE 8
int main() {
int a[SIZE] = {0};
int i;
int sum = 0;
for (i = (SIZE - 1); i >= 0; i--){
scanf("%d", &a[i]);
}
for (i = 0;i < SIZE; i++) {
if(a[i])
sum += 1 << a[i];
}
printf ("%d\n\n", sum);
return 0;
}
答案 2 :(得分:0)
我想你知道当执行num&lt;&lt; 1时,num值将加倍... 你编写的代码完全正常,但你分析错了。
在运行期间读取输入时,您正在读取最后一个元素到第一个元素。
因此,在您的输入中0 0 0 0 0 0 1 1 只有一个[0]和一个[1]是一个而所有其他的[i]都是零。
因此,在
for (i = 0;i < SIZE;i++) {
if (x & a[ i ])
sum = sum + (i << 1);
else
sum = (sum + 0);
}
only the initial i values that are 0 and 1 are left shifted whereas all the others are ignored as all other elements except a[0] and a[1] are zero.
因此,在第一次迭代中,sum = sum +(0 <&lt; 1) - &gt; sum = 0 + 0 - &gt;总和= 0
在第二次迭代中,sum = sum +(1 <&lt; 1) - &gt; sum = 0 + 2 - &gt;总和= 2
在所有其他迭代中,i值不会左移。因此,总和保持为2。 因此,你得到的答案是正确的......
不用担心,你现在是初学者......有一天你会成功的......