位运算,就是对一个比特(Bit)位进行操作。8个比特构成一个字节(Byte)
C语言提供了六种位运算符:
运算符 & | ^ ~ << >>
说明 按位与 按位或 按位异或 取反 左移 右移
按位与运算(&)
一个比特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常类似。
按位或运算(|)
参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||非常类似。
按位异或运算(^)
参与^运算两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为1,0^0为0,1^1为0。
取反运算(~)
取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。
左移运算(<<)
左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0。
右移运算(>>)
右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。
#include <stdio.h>
void bit_operation();
int main(){
int c;
int a=10;
c=a++;
printf("先赋值后运算\n");
printf("1、c=%d \n",c);
printf("2、a=%d \n",a);
a=10;
c=a--;
printf("2、c=%d \n",c);
printf("4、a=%d \n",a);
printf("先运算后赋值\n");
a=10;
c=++a;
printf("5、c=%d \n",c);
printf("6、a=%d \n",a);
a=10;
c=--a;
printf("7、c=%d \n",c);
printf("8、a=%d \n",a);
bit_operation();
}
//位运算
void bit_operation(){
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("1、c=%d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("2、c=%d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("3、c=%d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("4、c=%d\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("5、c=%d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("6、c=%d\n", c );
}
结果:
先赋值后运算
1、c=10
2、a=11
2、c=10
4、a=9
先运算后赋值
5、c=11
6、a=11
7、c=9
8、a=9
位运算:
1、c=12
2、c=61
3、c=49
4、c=-61
5、c=240
6、c=15
Press any key to continue