位运算的基本操作及应用题型

回顾计组知识

原码:
左移右移不管怎么样都补0 如果1被移动了 产生误差

反码:
都补1

补码:
左移补0
右移补1
(因为补码从右边数第一个1,以他为分界线,他的右边和原码是一样的
分界线的左边和反码是一样的,所以右移时左边补1 ,左移时右边补0

概述:

在这里插入图片描述
1、 与运算的用途:
1)清零

如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

2)取一个数的指定位

比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。

3)判断奇偶

只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。

2、或运算的用途:
1)常用来对一个数据的某些位设置为1

比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。

3、异或运算的用途:

1)翻转指定位

比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。

2)与0相异或值不变

例如:1010 1110 ^ 0000 0000 = 1010 1110

3)交换两个数

void Swap(int &a, int &b){
    
    
    if (a != b){
    
    
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

左移运算符(<<)

定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

右移运算符(>>)

定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。

操作数每右移一位,相当于该数除以2。

异或运算题目:

在这里插入图片描述
在这里插入图片描述

class Solution {
    
    
    public int singleNumber(int[] nums) {
    
    
        int single = 0;
        for (int num : nums) {
    
    
            single ^= num;
        }
        return single;
    }
}

Guess you like

Origin blog.csdn.net/weixin_45678130/article/details/121454857