C语言问题

【程序54】
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4)
(3)将上面二者进行&运算。
2.程序源代码:
main()
{
unsigned a,b,c,d;
scanf("%o",&a);
b=a>>4; //不懂
c=~(~0<<4); //不懂
d=b&c;
printf("%o\n%o\n",a,d);
}

这一题很多看不懂 b=a>>4;??什么意思?c=~(~0<<4);??什么意思?
希望可以详细的讲一下这道题谢谢了!

main()
{
unsigned a,b,c,d;
scanf("%o",&a);
b=a>>4; //a的二进制右移四位
//例如a=217(11011001),则a>>4为00001101
c=~(~0<<4); //0先取反,再左移四位,再取反
// 0:0000…000000
// ~0:1111…111111
// ~0<<4:1111…110000(~的优先级高于<<)
//~(~0<<4):0000…001111
d=b&c;
printf("%o\n%o\n",a,d);
}

参考资料:C程序设计(第三版)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-01
在C语言中,有几种位运算,<<和>>分别是将操作数的二进制数进行左移与右移,移动的位数在后面给出,都是将移出的数值舍弃,低位或高位补零.
~则是按位取反.&为按位与,
main()
{
unsigned a,b,c,d;
scanf("%o",&a);//输入八进制数,
b=a>>4; //b为a右移4位后的结果,
c=~(~0<<4); //先将零取反,得到全1,再左移四位,然后再取反;
d=b&c;//将b与c按位与,
printf("%o\n%o\n",a,d);
}
第2个回答  2008-06-01
在C语言中,有几种位运算,<<和>>分别是将操作数的二进制数进行左移与右移,移动的位数在后面给出,都是将移出的数值舍弃,低位或高位补零.
~则是按位取反.&为按位与.
可以举个数自己试试试

main()
{
unsigned a,b,c,d;
scanf("%o",&a);//输入八进制数,
b=a>>4; //b为a右移4位后的结果,
c=~(~0<<4); //先将零取反,得到全1,再左移四位,然后再取反;
d=b&c;//将b与c按位与,
printf("%o\n%o\n",a,d);
}
第3个回答  2008-06-01
你可以取一个具体的数,转换为二进制后,对它移位,取反,异或操作
相似回答