黑马程序员----C 语言学习笔记之位运算符

时间:2023-02-18 20:25:01
------Java培训、Android培训、iOS培训、.Net培训--------
位运算符


一、介绍
位运算是指按二进制进行的运算。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 不使用其他中间值--交换两个变量的值
方案一 
 <span style="white-space:pre"></span>    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