目录
一.&按位与
&的使用
- 这三个运算符号的使用都是有关二进制的
- 先将我们要 & 的两个数转化成二进制数,然后进行转换 口诀:同时为1,则为1 (下面我将会举例子进行验证)
下面举个简单的例子
数据的存储是以二进制的形式存储的,并且是以补码的形式存储,正数的原码,反码,补码是一样的
#include<stdio.h>
int main()
{
int a = 3;
int b = 4;
//a的补码为00000000000000000000000000000011
//b的补码为00000000000000000000000000000100
//运用口诀(同时为1,则为1)
//通过上面的比较,没有同时为1的
//c的补码为00000000000000000000000000000000
//所以c = 0;
int c = a & b;
printf("%d\n", c);
return 0;
}
下面再来一组练习
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("%d\n", c);
return 0;
}
答案为:1
- a的补码为00000000000000000000000000000011
- b的补码为00000000000000000000000000000101
- 口诀:同时 为1,则为1
- c的补码为00000000000000000000000000000001
二.|按位或
| 的使用
- 这三个运算符的使用很类似 口诀:有1为1,全0为0
例子
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
//a的反码为00000000000000000000000000000011
//b的反码为00000000000000000000000000000101
//口诀(有1为1,全0为0)
//c的反码为00000000000000000000000000000111
//所以c = 7;
int c = a | b;
printf("%d\n", c);
return 0;
}
三.^按位异或
^ 的使用
- 口诀:相同为0,相异为1
例子
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
//a的反码为00000000000000000000000000000011
//b的反码为00000000000000000000000000000101
//口诀(相同为0,相异为1)
//c的反码为00000000000000000000000000000110
//所以c = 6;
int c = 3 ^ 5;
printf("%d\n", c);
return 0;
}
四.妙用
我在刷题的过程中就遇到了 ^按位异或的妙用
题目:不能创建临时变量(第三个变量),实现两个数的交换
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
题目:给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。(这道题是LeetCode 136题) (刚开始这道题我想的就是暴力解法,直接两层for循环,找到只出现一次的数,但是这种方法时间复杂度很高,通过两种方法的比较,我们就能很好的感受到这三个运算符能给我们带来意想不到的结果)
//使用 ^按位异或 效率高
int singleNumber(int* nums, int numsSize)
{
//这里运用到 ^按位异或 的性质,两个相同的数进行 ^ 就会为0
//最后剩下的就是只有一个的那个元素
int n = 0;
for (int i = 0; i < numsSize; i++)
{
n = n ^ nums[i];
}
return n;
}
//暴力解法,时间复杂度高,效率很低
int singleNumber(int* nums, int numsSize)
{
int i = 0;
for(i = 0; i < numsSize; i++)
{
int k = 0;
for(int j = 0; j < numsSize; j++)
{
if(nums[i] == nums[j])
{
k++;
}
}
if(k == 1)
{
break;
}
}
return nums[i];
}
五.总结
- 这三个运算符的使用是要转换成二进制,注意运用口诀
- 在解题过程中,要多加思考,也许哪个运算符会给我们的代码质量带来很大的提升
感谢大家的观看,希望你能从这篇文章中学到一些东西(如有错误,提醒我,我会及时修改)
谢谢大家!!!