第1个回答 2011-11-25
首先,这个程序的结果,在不同的计算机上会不同。它可能受字长、位移补位的方式的不同而改变。
不过要想理解其中的位运算规则也不难,把程序稍稍改一下,让每一步运算结果都按二进制打印出来。运行下面的程序,相信你会觉得一目了然:
#include <stdio.h>
void Print( char const *title, int value)
{
int i = sizeof( int) * 8;
printf( "%8s = ", title);
while ( i --)
putchar( 1 & ( value >> i) ? '1' : '0');
putchar( '\n');
}
int main()
{
int a=12,b=-10,c,d,e,f,g,h;
Print( "a", a);
Print( "b", b);
Print( "c = a&b", c = a&b);
Print( "d = a|b", d = a|b);
Print( "e = a^b", e = a^b);
Print( "f = a<<2", f = a<<2);
Print( "g = a>>2", g = a>>2);
Print( "h=~b", h=~b);
return 0;
}本回答被提问者采纳
第2个回答 2011-11-26
位运算~有位与,位或,位非,位异或,左移,右移。。
1.位与
就如题目中的c=a&b,假设a=3,b=4,化为2进制后
a=0000 0000 0000 0000 0000 0000 0000 0011
b=0000 0000 0000 0000 0000 0000 0000 0100
我们知道与是都为1才返回1,所以结果是
C:0000 0000 0000 0000 0000 0000 0000 0000.也就是0~~
2.位或
像上面的一样,只不过进行的是或运算
3.位非
对数字求负,然后减1.如10~=-11
4.位异或
也是对数字的2进制进行运算,但是只有一个数为1才返回1,如还是c=a^b,a=3,b=4,二进制形式如上面的~结果为0000 0000 0000 0000 0000 0000 0000 0111,也就是十进制的7
5.左移
把数字的2进制形式的所有位数向左移动指定的位数,后面用0补上
6.右移。
与左移相反~你懂的~哦哦
第3个回答 2011-11-25
#include<stdio.h>
int main() {
int a = 12,b = -10;
printf("(%d)&(%d) = %d\n",a,b,a&b);
printf("(%d)|(%d) = %d\n",a,b,a|b);
printf("(%d)^(%d) = %d\n",a,b,a^b);
printf("(%d << 2) = %d\n",a,a<<2);
printf("(%d >> 2) = %d\n",a,a>>2);
printf("(%d~) = %d\n",b,~b);
return 0;
}
(12)&(-10) = 4 // 00001100&11110101 = 00000100 = 4,按位与
(12)|(-10) = -2 // 00001100|11110101 = 11111110 = -2,按位或
(12)^(-10) = -6 // 00001100^11110101 = 11111110 = -6,按位异或
(12 << 2) = 48 // 左移2位,等同于乘以4
(12 >> 2) = 3 // 右移2位,等同于除以4
(-10~) = 9 // 按位求反。