0

为什么“ (num >> i)& 1 ”的结果在第二个循环中是 1?

main() {
  char num = 5 ; 
  int i , count = 0 ;

  for(i=0;i<8;i++){
    if ((num >> i)& 1 )
        count++;    
  }
  printf("%d", count);
}
4

1 回答 1

0

对于初学者,请注意变量 num 本身在 for 循环中没有被更改

  for(i=0;i<8;i++){
    if ((num >> i)& 1 )
        count++;    
  }

它的二进制表示是

00000101

(注意考虑到声明

char num = 5 ; 

与声明不同

char num = '5' ; 
  • 结束注。)

在循环的第一次迭代中,当 i 等于 0 时,移位运算符无效,因此 if 语句的计算结果为逻辑真,变量 count 将递增。

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

于 2021-06-09T12:49:40.107 回答