C语言位运算,代码看不懂,求解释

#include<stdio.h>
void 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);
}
看不懂啊,就拿一个数(a)带进去详细说一下每一步的运算过程吧。

第1个回答  推荐于2016-03-17
先介绍一下位运算的法则:
1. >>是按位右移运算符,无符号数右移一位相当于该数除以2。移位时,移出的位数全部丢弃。对于无符号数,则高位补0;对于有符号数,则符号位补0还是1,不确定。
2. <<是按位左移运算符,无符号数左移一位相当于该数乘以2。移位时,移出的高位全部丢弃,低位全补0。
3. ~是按位取反运算符,用来对一个二进制数按位取反。即将0变1,1变0。
4. &是按位与运算符,参加运算的两个数据,按位进行与运算。如果两个相应的位都为1,则该位为1,否则为0。
5. |是按位或运算符,参加运算的两个数据,按位进行或运算。如果两个相应的位至少有一个为1,则该位为1,否则为0。
6. ^是按位异或运算符,若两个相应的位同号,则该位为0,不同则为1。
然后就你这个实际问题解答:
假设输入的a是4,对应的8位就是00000100,b是a右移4位,变成了00000000,也就是0,c的值比较麻烦,首先是把0取反,结果是全1,即11111111(此处与C编译器的位数有关,16位编译器和32位编译器结果是不同的,不过不影响最终结果),然后左移4位,变为11110000,再取反,得到00001111,也就是十进制的15,d等于b和c进行按位与,也就是00000000跟00001111按位与,结果是00000000,也就是全0,所以最终打印结果(注意是以8进制形式打印),a是原来输入的4,d是0本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网