提示:博主排版狗屎,前排提醒
前言
因为在力扣里的刷题中遇到了不少的位运算的题目,然后打算总结一下
一、位运算是什么?
我个人理解的话就是在二进制上对数据操作。
二、使用示例
1.异或的应用
1-1
示例:(来源力扣 面试题17.04. 消失的数字题目地址)
class Solution {
public int missingNumber(int[] nums) {
int ans=0,n=nums.length;
for(int i=1;i<=n;i++){
ans^=i;
}
for(int num:nums){
ans^=num;
}
return ans;
}
}
1-2
题目:有两个只出现过一次的数,其它数都出现过两次,求出这两个数?
public class Find {
public static void find(int []nums){
int ans1=0,ans2=0,n=nums.length;
int d=0;
for(int i=0;i<n;i++){
d^=nums[i];
}
d&=(-d);
for(int i=0;i<n;i++){
if((nums[i]&d)==0){
ans1^=nums[i];
}else
ans2^=nums[i];
}
System.out.println("两个数是:"+ans1+" "+ans2);
}
public static void main(String[] args) {
int []nums=new int[]{1,6,3,3,6,7,7,9,8,9};
find(nums);
}
}
1-3(拓展)
(来源:力扣137. 只出现一次的数字 II 地址)
class Solution {
public int singleNumber(int[] nums) {
int[] cnt = new int[32];
for (int x : nums) {
for (int i = 0; i < 32; i++) {
if (((x >> i) & 1) == 1) {
cnt[i]++;
}
}
}
int ans = 0;
for (int i = 0; i < 32; i++) {
if ((cnt[i] % 3 & 1) == 1) {
ans += (1 << i);
}
}
return ans;
}
}
***注:这个代码和讲解来自于三叶姐,我不想码字,就直接粘过来了,大家快去力扣关注三叶姐***
二.与和或
temp&(temp-1)可以找出最后一个1
2.1消去最后一个1
例如a=1110
a-1=1101
(a-1)&a=1100
2.2分析一个数是不是2的幂次方
因为如果X为2的幂次方,则X的二进制下只有一个1
所以只要判断(X-1)&X==0?就可以了
2.3数A转变成数B需要几次二进制操作
先将A与B异或,这样就能通过异或得到的数中有多少个1来判断有多少个数位的不同
然后统计1的个数就好了
即不断地消去最后一个1,累计次数就好了
总结
还没写完,之后再补,先码着