位运算符
一、介绍
位运算是指按二进制进行的运算。C语言提供了六种位操作运算符,这些运算符只能针对整型的数据。也就是带符号和无符号的,如char,short,long, int等
二、位运算符
用于二进制之间的运算
1. & 按位与
例如:9 & 4
即 0000 1001
& 0000 0100
--------------
0000 0000
printf("%d",9&4);//打印结果:0
2. | 按位或
例如:9 | 4
即 0000 1001
| 0000 0100
--------------
0000 1101
printf("%d",9|4);//打印结果:11
3. ~ 按位取反
例如:~4
即
~ 0000 0100
--------------
1111 1011补 ---> 1111 1010反--> 1000 0101原 = [-5]
printf("%d",~4);//打印结果:-5
4. >> 右移位
规则:各二进制位全部右移n位,低位丢弃,高位要补符号位。相当于 原数/2^n.不会改变一个数的正负性
如 8 >> 2 = 2
5. << 左移位
规则:各二进制位全部左移n位,高位丢弃,低位补0。相当于 原数*2^n
例如:2<<3
0000 0010 左移 成为0 0010 ,此时高位被丢弃,低位补0,结果为:0 0010 000 = (0001 0000)2 = (16)10
致命问题:左移可能会改变一个数的正负性
6. ^ 按位异或
计算规则:相同为0,不同为1
例如:9 ^ 4
即 0000 1001
^ 0000 0100
--------------
0000 1101 --- > 13
printf("%d",9^4);//打印结果:13
二、用法
1.& a.任何数与1的与运算都取该数的最低位。可演变为取某个数的特定位
如 9 & 1 = 1
b.把某数的第n位置为0
如 把9的第3位置为0, 9 & 7 ---->1001 & 0111 = (0001)2 = (1)10
2.使用举例
2.1 把十进制数按照二进制打印
- int num = 8;
- int len = sizeof(num) * 8;//取得数字的二进制长度
- int result[len];
-
- for (int i = 0; i < len; i++) {
- result[len - 1 - i ] = num & 1;//每次取最低位
- num = num >> 1;//右移一位
- }
-
- for (int j = 0; j < len; j++) {
- printf("%d", result[j]);
- }
复制代码
2.2 判断一个数的奇偶性
- int num = 10;
- int n = num & 1;//取最低位
-
- if(n){
- printf("奇数");
- }else{
- printf("偶数");
- }
复制代码
2.3 不使用其他中间值--交换两个变量的值
方案一
- int a = 3, b = 5;
- a = a + b;
- b = a - b;
- a = a - b;
- printf("a = %d, b = %d\n",a, b);
复制代码
打印结果:a = 5, b = 3
隐患:如果两个数很大,那么就会溢出
方案二
- int a = 4, b = 5;
- a = a ^ b;
- b = a ^ b;
- a = a ^ b;
- printf("a = %d, b = %d\n",a, b);
复制代码
打印结果:a = 5, b = 4
|
|