为什么“ (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);
}
为什么“ (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);
}
对于初学者,请注意变量 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 从其较低有效位到最高有效位的内部表示。