问题描述
为什么“(num >> i)& 1”的结果在第二个循环中是1?
Odds Ratios IC (95%)
GrupoBAJO 1.13 *** 1.07 – 1.20
GrupoMEdio 1.08 * 1.02 – 1.14
Observations 42455
解决方法
首先要注意变量 num 本身不会在 for 循环内改变
for(i=0;i<8;i++){
if ((num >> i)& 1 )
count++;
}
它的二进制表示是
00000101
(注意考虑到声明
char num = 5 ;
与声明不同
char num = '5' ;
- 结束注释。)
在循环的第一次迭代中,当 i 等于 0 时,移位运算符不起作用,因此 if 语句的计算结果为逻辑真,变量计数将递增。
当 i 等于 2 时,变量计数也会增加。
因此,您将得到 count 等于 2,因为在变量 num 的内部表示中只设置了两位..
为了更清晰,重写程序如下
#include <stdio.h>
int main(void)
{
char num = 5 ;
int count = 0 ;
for ( int i = 0; i < 8; i++ )
{
int result = (num >> i)& 1;
printf( "i = %d,result = %d\n",i,result );
if ( result ) count++;
}
printf( "\ncount = %d\n",count );
}
程序输出为
i = 0,result = 1
i = 1,result = 0
i = 2,result = 1
i = 3,result = 0
i = 4,result = 0
i = 5,result = 0
i = 6,result = 0
i = 7,result = 0
count = 2
实际上,从上到下的输出显示了变量 num 从其较低有效位到最高有效位的内部表示。