关于C语言位移的一个问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 06:06:31
函数:
1. void displayBits(unsigned value)
2. {
3. unsigned c;
4.
5. /*定义displayMask并左移31位*/
6. igned displayMask = 1<<31;
7.
8. printf("%10u = ", value);
9.
10./*遍历所有的位*/
11.for(c = 1; c <= 32; c++){
12.putchar(value&displayMask ? '1':'0');
13.value <<= 1;/*将value左移一位*/
14.
15.if(c % 8 == 0){/*每输出8位后输出一个空格*/
16.putchar(' ');
17.}/*if*/
18.}/*for*/
19.
20.putchar('\n');
21.}/*函数displayMask结束*/
22.
用来将无符号整数按二进制方式输出.
第6行定义了一个大小为2的31次方的无符号整数,最高位为1,其它位为0;
无符号数value和displayMask使用&运算符,因为和0进行与操作的任何位结果都是0,则我不明白第12行语句是如何返回value的真实二进制数的.
以上是我的理解,我知道肯定是我错了,而不可能是这个函数错了,希望高手教教我.
在线等!

putchar(value&displayMask ? '1':'0');
这里只有1个&表示按位进行与运算,比如value=10110 displaymask=10000
value&displayMask=10000 为真输出字符"1";然后左移1位value=01101 value&displayMask=00000 为假输出字符"0";继续这么下去,输出的就是10110 你可以自己试下去,这个是一种算法.因为displaymask的数值是第一位为1其他为0,所以每次进行&操作时只有value的最高位才能"与"出0或1,后面的肯定是0;一旦value的最高位是1结果就是10000为真,输出1;若是value的最高位0,value&displayMask的结果肯定是00000,非真,输出0,通过将value依次左移1位,它的各位数值就复现出来了...你要理解 ?A:B 的意思是"?"前面结果为真就进行A操作,否则进行B操作,value&displayMask这个的意思是按位与.

第6行: displaymask = 1000 0000 0000 0000 0000 0000 0000 0000
for循环依次用它与value各位相与
以上都没有问题

“无符号数value和displayMask使用&运算符,因为和0进行与操作的任何位结果都是0,则我不明白第12行语句是如何返回value的真实二进制数的. ”

先来看看相与:
1 & 1 = 1;
1 & 0 = 0;
0 & 0 = 0;

那么,显而易见12行的意思是如果value与displaymask的对应位为1则打印1,否则打印0