位运算的妙用

位运算是计算机科学中对整数二进制位进行操作的基础操作,包括与(&)、或(|)、异或(^)、左移(<<)和右移(>>)。本文通过实例解释了这些运算符的工作原理,并展示了它们在简化字母序位计算和查找数组中唯一元素等实际问题中的高效应用。位运算能够帮助程序员编写更简洁、更快的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先 我们先来了解下什么叫位运算。程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。

常用的几种位运算

1.与(&)and

效果:

当倆个数在二进制对应位数上均为1时 ,该位得1,否则出0

7& 11

0000 0111  ->7

0000 1011  ->11

0000 0011    ->3

7&11=3

2.或(|)or

效果:

当倆个数在二进制对应位上有一个是1时,该位得1,否则出0

7 | 11

0000 0111  ->7

0000 1011  ->11

0000  1111  ->15

7 | 11=15

3.异或(^)xor

效果:

当倆个数在二进制对应位上不同时出1,否则出0

7 ^ 11 

0000 0111  ->7

0000 1011  ->11

0000 1100  ->12

7^11=12

4.左移(<<)

效果:

将二进制整体向左移动 不足的地方用0补充

例:

7<<1

0000 0111 ->7

0000 1110 ->14

7<<1=14

5.右移(>>)

效果:

将二进制整体向右移动 不足的地方用0补充

7<<1

0000 0111 ->7

0000 0011 ->3

7>>1=3

位运算在某些情况下可以帮助我们更快的得到我们想要的结果,并节约代码量。

比如说

我们希望知道某一个字母在字母表中的顺序,不论大小写。正常的思路是不是先判断该字母的大小写,然后用他的ASCII去减去'a'或者'A'的ascii码得出答案,但是用位运算就十分简单了。字母'A'的ASCII码是41H(0100 0001B),字母'a'的ASCII码是61H(0110 0001B),字母'A'与'a'的二进制后5位是相同的,所以无论是大写字母还是小写字母x,x &31(1 1111B)的值就是x在字母表里的顺序。所以之前一大堆的代码就可以直接简化为x(某个字母)&31就完事了。

再比如

给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数 。正常做的话dddd,挺麻烦的。但是用' ^' 就会变的十分简单了。由上述异或的效果可以得出两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身,所以这道题只需要将所有的数据进行异或最后得到的结果就是我们要的答案啦。

代码如下

int find(int[] arr){

int tmp = arr[0];

for(int i = 1;i < arr.length; i++){

tmp = tmp ^ arr[i];

} return tmp;

}

yjq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值