我不太明白的是第28行的这句语句value & displayMask ? '1' : '0'
从结果反推,每次进行按位与运算的应该只有value和displayMask的最高位,这是什么原因?
另外书中又称displayMask是掩码变量,这是什么意思呢?
#include <stdio.h>
void displayBits( unsigned value ); /* prototype */
int main( void )
{
unsigned x; /* variable to hold user input */
printf( "Enter an unsigned integer: " );
scanf( "%u", &x );
displayBits( x );
return 0; /* indicates successful termination */
} /* end main */
/* display bits of an unsigned integer value */
void displayBits( unsigned value )
{
unsigned c; /* counter */
/* define displayMask and left shift 31 bits */
unsigned displayMask = 1 << 31;
printf( "%10u = ", value );
/* loop through bits */
for ( c = 1; c <= 32; c++ ) {
putchar( value & displayMask ? '1' : '0' );
value <<= 1; /* shift value left by 1 */
if ( c % 8 == 0 ) { /* output space after 8 bits */
putchar( ' ' );
} /* end if */
} /* end for */
putchar( '\n' );
} /* end function displayBits */
3 个解决方案
#1
如果是我写的话,肯定是移动掩码变量,而这里取巧移动待测量变量。
这样掩码是一个常量,方便优化。
待测试变量与掩码相对移动即可
这样掩码是一个常量,方便优化。
待测试变量与掩码相对移动即可
#2
掩码是为了选出一个数中的特定位。
比如你的例子中displayMask值为1<<31,即为0x8000,只有左数第一位是1,其余全部是0。
其余位为0的作用在于做&运算,不管另一个操作数在这个位的值是0还是1,运算完该位均为0,;
反之,左数第一位的值做&运算,另一个操作数在左数第一位的值就是结果位的值。
/* 8位长度的例子 */
1 0 1 1 0 0 1 0 测试数
&1 0 0 0 0 0 0 0 displayMask
---------------------
1 0 0 0 0 0 0 0 结果为非0
0 1 0 0 1 1 1 0 测试数
&1 0 0 0 0 0 0 0 displayMask
---------------------
0 0 0 0 0 0 0 0 结果为0
value & displayMask ? '1' : '0'。
意思是说value和displayMask做&运算,得到结果非0,返回字符‘1’;得到结果0,返回字符‘0’
#3
因为要显示的数字顺序一般都是从高到低、从左往右的,所以第一次判断最高位,第二次无符号数据左移一位,判断的就是次高位了,以此类推,直到处理完32位。顺便提一句,这个程序只能在int为32位的环境中正确运行,绝对是学校里编的
#1
如果是我写的话,肯定是移动掩码变量,而这里取巧移动待测量变量。
这样掩码是一个常量,方便优化。
待测试变量与掩码相对移动即可
这样掩码是一个常量,方便优化。
待测试变量与掩码相对移动即可
#2
掩码是为了选出一个数中的特定位。
比如你的例子中displayMask值为1<<31,即为0x8000,只有左数第一位是1,其余全部是0。
其余位为0的作用在于做&运算,不管另一个操作数在这个位的值是0还是1,运算完该位均为0,;
反之,左数第一位的值做&运算,另一个操作数在左数第一位的值就是结果位的值。
/* 8位长度的例子 */
1 0 1 1 0 0 1 0 测试数
&1 0 0 0 0 0 0 0 displayMask
---------------------
1 0 0 0 0 0 0 0 结果为非0
0 1 0 0 1 1 1 0 测试数
&1 0 0 0 0 0 0 0 displayMask
---------------------
0 0 0 0 0 0 0 0 结果为0
value & displayMask ? '1' : '0'。
意思是说value和displayMask做&运算,得到结果非0,返回字符‘1’;得到结果0,返回字符‘0’
#3
因为要显示的数字顺序一般都是从高到低、从左往右的,所以第一次判断最高位,第二次无符号数据左移一位,判断的就是次高位了,以此类推,直到处理完32位。顺便提一句,这个程序只能在int为32位的环境中正确运行,绝对是学校里编的