关于位运算的问题:条件运算符第一个操作数是个按位与的表达式,我不太明白机器是怎么执行这句语句的?

时间:2022-05-10 01:17:28
在学C的位运算时,书上给了这样一个例程,目的是输出数据在内存的存储形式。
我不太明白的是第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位的环境中正确运行,绝对是学校里编的