位运算有按位异或,按位与,按位或,按位取反,位移这几种,位运算都要转换成二进制来操作
按位异或:
若两个数对应的位相反(即1和0),得1
如 1010
1001
得 0011
按位与:
若两个数对应的位都为1,得1
如 1010
1001
得 1000
按位或:
若两个数对应的位只要有一个为1,得1
如 1010
1001
得 1011
按位取反
把这个数的1变成0,0变成1
如 1010
得 0101
这样子看起来似乎得到的是5(0101转10进制是5),然而并不是,一个int类型的是32位,这里我们只是看到了这个数的后四位,前面还有28位0,这28个0在取反的时候都变成了1,即0000000000000000000000000001010变成1111111111111111111111111111011,所以最终得到的是-11.而之前的位运算都是两个数在比较,所以就不会把前面的0进行变换。
位移:
向左移3位:
把这个数的左边的3个数去掉,右边补0。
如 0001010
得 1010000
向右移三位:
把这个数右边的三个数去掉,左边补0
如 0001010
得 0000001
代码:
#include <stdio.h>
/*
*按位异或(看两个数的二进制对应的位上是否相反)
*如 1010 10
* 1001 9
*得 0011 3
*/
int wei1(int a,int b){
return a ^ b;
}
/*
*按位与(看两个数的二进制对应的位上是否都为1)
*如 1010 10
* 1001 9
*得 1000 8
*/
int wei2(int a,int b){
return a & b;
}
/*
*按位或(看两个数的二进制对应的位上是否有一个为1)
*如 1010 10
* 1001 9
*得 1011 11
*/
int wei3(int a,int b){
return a | b;
}
/*
*按位取反(把这个数的二进制的1变成0,0变成1)
*如 1010 10
*得 0101 -11
*因为int类型的位是32位,这里只操作了后四位,前面还有28个0,全部变成了1,就得到了-11
*/
int wei4(int a){
return ~a;
}
/*
*按位取反
*这次是字符,字符只占8个位
*如 00001010 10
*得 11110101 245
*/
unsigned char wei5(unsigned char a){
return ~a;
}
/*
*位移,向左移n位,
*如 n=3
* 0001010 10
*得 1010000 80
*/
int move1(int a,int n){
return a << n;
}
/*
*位移,向右移n位,
*如 n=3
* 0001010 10
*得 0000001 1
*/
int move2(int a,int n){
return a >> n;
}
void main(){
printf("按位异或:%d\n",wei1(10,9));
printf("按位与:%d\n",wei2(10,9));
printf("按位或:%d\n",wei3(10,9));
printf("按位取反(int):%d\n",wei4(10));
printf("按位取反(char):%d\n",wei5(10));
printf("位移,向左移3位:%d\n",move1(10,3));
printf("位移,向右移3位:%d\n",move2(10,3));
getchar();
}