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

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

被折叠的 条评论
为什么被折叠?



