请运行此代码并告诉我为什么得到这个结果

问题描述

为什么“(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 从其较低有效位到最高有效位的内部表示。