位运算(符号+实例+用法持续补充)

2019_7_24
位运算


首先了解,位运算是基于整数的二进制上的操作
位运算有几个操作符要知道


1.and(&)
按位与操作,常用来取二进制的最后一位,
1)判断奇偶; n&1==1为奇数,反之为偶数
2)用来二进制->十进制(快速幂等等)while(n)if(n&1)ans*=a; a*=a;n>>=1;
3)n&(n-1) 可以把从末尾开始依次把1变成0
如n=10010, 则n-1=10001 ,n&(n-1)=10000;最后面的那个1就被去掉了。
可以用来计算二进制中1的数量
while(n)cnt++;n&=(n-1);
4)可以将任意位置零
低八位清零n &= 0xffffff00;
低四位清零n &= 0xff00;


2.or(|)
按位或操作,常用与将最后一位置1
1)n|1,将最后一位置1
2)将任意位置一
低八位置一:n&=0xff;


3,xor(^)
按位异或操作,
异或的几个公式
a^a=0;
a^0=a;
1)交换数a和b,a^b ^a ^b
2)异或同一个数两次,就抵消了。
可以在数组的题中进行实现。
比如在偶数个数里面找出奇数个的数等等,做起来都很简单。


4,not(~)
按位取反,把所有的二进制位取反
非负数是,可以取得与上界的差值。


5.shl(<<)
按位左移,左移一位相当于原来的2倍
1)计算幂
3<< n 相当于 n222 ;
则3<<2,就是用来计算2的指数次了。2
222
常在算法中使用,更快不占用空间,程序中乘以2的操作请尽量用左移一位来代替。


6,shr(>>)
按位右移,用处多着呢,我也不清楚
和shl相似,a shr b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。我们也经常用shr 1来代替div 2,比如二分查找、堆的插入操作等等。
想办法用shr代替除法运算可以使程序效率大大提高。最大公约数的二进制算法用除以2操作来代替慢得出奇的mod运算,效率可以提高60%。


我做的几个关于位运算的题目

1.给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3] 输出:[ [3], [1], [2], [1,2,3],
[1,3],[2,3],[1,2], [] ]

class Solution {
public:
    vector> subsets(vector& nums) {
        int len=nums.size();
        vector< vector >sa;
        for(int i=0; i< (1<t;
            for(int j=0; j

2.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1] 输出: 1

示例 2:

输入: [4,1,2,1,2] 输出: 4

class Solution {
public:
    int singleNumber(vector& nums) {
        for(int i=1;i
  1. 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2] 输出: 3

示例 2:

输入: [0,1,0,1,0,1,99] 输出: 99

class Solution {  //soluiton2
public:
    int singleNumber(vector& nums) {
        double a=0,b=0,ans=0;
        for(int i=0; ist(nums.begin(),nums.end());
        nums.clear();
        nums.assign(st.begin(),st.end());
        for(int i=0; i

你可能感兴趣的:(位运算(符号+实例+用法持续补充))