学益得线上课堂之位运算技巧总结

本文深入探讨了位运算在编程中的高效应用,包括奇偶数判断、数字交换、寻找唯一数、幂次计算等,提供了比传统算法更优的解决方案。

程序中的所有数在计算机内存中都是以二进制的形式存储的。所谓位运算,就是直接对整数在内存中的二进制位进行操作。一般来说,如果能用位运算来解决问题,效率都是比较高的。

01 判断奇偶数

传统解法

判断数字的奇偶性从概念就能下手,一个数字如果能被2整除,就是偶数,如果不能,就是奇数。代码如下:

void odd_even(int n)
{
   
       
	if (n % 2 == 1)    
	{
   
              
		printf("n是奇数!\n");    
	}   
}

高逼格解法

在计算机看来,数字都是以二进制形式存在的,所以如果二进制的最低位是1的话,就是奇数,是0的话,就是偶数。

void odd_even(int n)
{
   
          
	if(n & 1 == 1)    
	{
   
           
		printf("n是奇数!\n");    
	}
}

02交换两个数字

传统解法

刚学习C语言的时候,老师就教过我们最基本的交换算法,定义一个中间变量,经过三次赋值,就能实现两个数字的交换。代码如下:

int swap(int x, int y)
{
   
       
	int tmp = x;    
	x = y;    
	y = tmp;
}

高逼格解法

int swap(int x, int y)
{
   
       	
	x = x ^ y;   
	y = x ^ y;    
	x = x ^ y;
}

这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:

1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0
2.任意一个变量X与0进行异或运算,结果不变,即X^0=X
3.异或运算具有可结合性,即a^ b ^ c =(a ^ b)^ c = a ^(b ^ c)
4.异或运算具有可交换性,即a ^ b = b ^ a

分析:

第一步:

 a = a ^ b;

完成后a变量的结果为a ^ b;

第二步:

b = a ^ b; 

此时赋值号右边的a保存的是a ^ b的值,那么将赋值号右边的a用a ^ b替换,得到:

(a ^ b) ^ b;   //等价于:a ^ (b ^ b);  //等价于:a ^ 0;//等价于:a;

即经过第二步运算后b中的值为a,即b = a,将a换到了b里;

第三步:

 a = a ^ b;

此时赋值号右边的a保存的仍然是a ^ b的值,不变,而赋值号右边的b已经是a 了,将赋值号右边的a、b分别进行替换,即此时赋值号右边:

a ^ b;
//等价于:   
(a ^ b) ^ a;
//等价于:
a ^ b ^ a;
//等价于:
a ^ a ^ b;
//等价于:  
0 ^
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值