C语言操作符详解(2)

73 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

位操作符

位操作,有&(按位与) ,|(按位或),^(按位异或)~(按位取反)。 位操作符顾名思义,是针对二进制位的操作,有两个操作数进行,二进制位进行操作运算。 这里我们的二进制位都是指的补码,因为一个数以补码的形式存放在内存中。

//   00000000 00000000 00000000 00100010
//   00000000 00000000 00000000 11010110
// & 00000000 00000000 00000000 00000010  
// | 00000000 00000000 00000000 11110110
// ^ 00000000 00000000 00000000 11110100 
位操作符作用
&两操作数二进制位都为真(1)结果为真(1)否者为假(0)
``两操作数二进制位为假(0)结果为假(0)否者为真(1)
^一真(1)一假(0)结果为真(1),否者为假(0)
~二进制位按位取反,1变0,0变1

位操作符的应用

//尝试写一下这个代码
include <stdio.h>
int main()
{
    int num1 = 1; //00000000 00000000 00000000 00000001
    int num2 = 2; //00000000 00000000 00000000 00000010
    num1 & num2; // 00000000 00000000 00000000 00000000
    num1 | num2; // 00000000 00000000 00000000 00000011
    num1 ^ num2; // 00000000 00000000 00000000 00000011
    return 0;
}

一道面试题小试牛刀

不创建新的变量,实现两个变量的交换。

//方法一
#include<stdio.h>
int main()
{
 int a=3; // 00000000 00000000 00000000 00000011
 int b=5; // 00000000 00000000 00000000 00000101
 a=a^b;  //  00000000 00000000 00000000 00000110
 b=a^b;  //  00000000 00000000 00000000 00000011
 a=a^b;   // 00000000 00000000 00000000 00000101
}

有趣的一道代码,利用^按位异或实现了两数的交换。 ^异或操作符的性质 a^a=0; a^0=a; 经常利用这两条性质解题,写出优秀的代码!

//方法二
#include<stdio.h>
int main()
{
  int a=3;
  int b=5;
  a=a+b;  //a=8
  b=a-b; // b=3
  a=a-b; // a=5
}

求一个整数存储在内存中二进制1的个数

//方法一
#include<stdio.h>
int main()
{
 int n=10;
 int count=0;
 while(n)
 {
 	if(n%2==1)
 	{
 		count++;
 	}
 	n>>=1;
 }
 printf("输入二进制位1的个数:%d",count);
}

在这里插入图片描述思考上面的代码是否存在问题 当n为负数时? 在这里插入图片描述可以看到程序将会一直死循环下去。 我们优化一下!

//方法二
#include<stdio.h>
int main()
{
 	int i=0;
 	int count=0;
 	int num=-3;
 	for(i=0;i<32;i++)
 	{
 		if((num>>i)&1==1)   //移位并且判断最后一位是否为1
 			count++;
 	}
	return 0;
}

在这里插入图片描述

每次都要进行32次循环,我们是否可以再次优化一下!

//方法三
#include <stdio.h>
int main()
{
    int num = -1; // 10000000 00000000 00000000 00000001
              //补码  11111111 11111111 11111111 11111111
    int i = 0;
    int count = 0;//计数
    while(num)
    {                    
        count++;          
        num = num&(num-1);//丢弃最后一位1
    }
    printf("二进制中1的个数 = %d\n",count);
    return 0;
}

在这里插入图片描述上面这个代码是不是很神奇,一般人想不到,这就是代码的魅力!

赋值操作符

赋值操作符,我们再熟悉不过了。 我们可以通过赋值操作符,将一个变量改变成你想要的值!

#include<stdio.h>
int main()
{
 	int weight=180;
 	weight=125;  //不满意可以改变
 	//连续赋值
 	int a=13,b=0,c=0;
 	a=b=c=6;
 	//连续赋值操作缺点不易调试
}

复合赋值操作符

+= -= *= /= %= .........

可以看到很多复合赋值操作符

   a+=2; ===>   a=a+2;
   a*=3;  ===>   a=a*3;
     //其他运算符一个道理
   ....

这边是复合赋值操作符,使用起来很简单,也很方便!