题目描述
学习使用按位与 &。
程序分析:
0&0=0; 0&1=0; 1&0=0; 1&1=1 。
源代码
#include <stdio.h>
int main()
{
int a,b;
a=077;
b=a&3;
printf("a & b(decimal) 为 %d \n",b);
b&=7;
printf("a & b(decimal) 为 %d \n",b);
return 0;
}
变量初始化与运算
-
a = 077 ; 077 是八进制数(以 0 开头标识),转十进制为 63,二进制为 0011 1111 。
-
b = a & 3 ;
-
3 的二进制是 0000 0011 ,按位与运算规则是对应二进制位都为 1 时,结果位才为 1 。
运算过程
a: 0011 1111
3: 0000 0011
&: 0000 0011 (十进制为 3 )
“对应二进制位都为 1” 是按位与( & )运算的核心规则,简单说是把两个数转成二进制后,从右往左逐位对齐,只有当同一位置上的二进制数字都是 1 时,结果的这一位才是 1;只要有一个是 0,结果这一位就为 0 。
比如代码里 a = 63 (二进制 0011 1111 ),和 3 (二进制 0000 0011 )
二进制位 | 5 | 4 | 3 | 2 | 1 | 0 |
a 的二进制 | 0 | 0 | 1 | 1 | 1 | 1 |
3 的二进制 | 0 | 0 | 0 | 0 | 1 | 1 |
按位与结果(都为1才是1) | 0 | 0 | 0 | 0 | 1 | 1 |
可以看到,只有最右边两位(位 0、位 1 )上,两个数的二进制都是 1,所以结果的这两位是 1,最终结果就是 0000 0011 (十进制 3 )。
所以 b 的初值为 3,输出 a&b(decimal)为3。
- b &= 7(等价于 b = b & 7 )
- 7 的二进制是 0000 0111 ,当前 b = 3 (二进制 0000 0011 ),按位与运算:
b: 0000 0011
7: 0000 0111
&: 0000 0011 (十进制为 3)
输出 a&b(decimal)仍为3。
以上示例输出结果
a & b(decimal) 为 3
a & b(decimal) 为 3