【问题标题】:Please run this code and tell me why got this result请运行这段代码并告诉我为什么会得到这个结果
【发布时间】:2021-08-26 10:50:07
【问题描述】:

为什么 " (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);
}

【问题讨论】:

  • 简单回答;不是。 1 仅在第一次和第三次迭代中,但运行代码并没有显示。您必须在循环内移动printf(并添加换行符)。输出的2 不是第二个循环:这意味着有两个位被设置为1
  • 抱歉,我现在无法纠正拼写错误:输出的 2 并不意味着第二个循环:这意味着有两位 num 设置为 1。二进制的十进制值500000101
  • 那为什么不能自己运行这段代码呢?

标签: c for-loop char bit-shift bitwise-and


【解决方案1】:

对于初学者,请注意变量 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 也会增加。

因此,您会得到 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 从低位到最高位的内部表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多