位运算题目


最大单词长度乘积

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

class Solution {
public:
    
    int maxProduct(vector<string>& words) {
        int ans=0;
        int n=words.size();
        //将每个字符串转换为二进制
        vector<int>word;
        for(string w:words){
            unordered_set<char>set;
            for(char ch:w){
                set.insert(ch);
            }
            int binary=0;
            for(int i=0;i<26;++i){
                int x=set.find('a'+i)!=set.end()?1:0;
                binary=(binary<<1)|x;
            }
            word.push_back(binary);


        }
        for(int i=0;i<n;++i){
            for(int j=i+1;j<n;++j){
                if((word[i]&word[j])==0){//优化比较两个字符串
                    ans=ans>words[i].length()*words[j].length()?ans:words[i].length()*words[j].length();
                    
                }
            }
        }
        return ans;
    }
};

在这里插入图片描述


整数转换

在这里插入图片描述

解题思路:

C++ 竟然没有逻辑移位符,要想实现逻辑移位,必须先将数字转换位 unsigned int类型,然后进行>> 或者 << 。

class Solution {
public:
    int convertInteger(int A, int B) {
        int ans=0;
        while(A!=0||B!=0){
            if((A&1)!=(B&1)){
                ans++;
            }
            A=(unsigned)A>>1;
            B=(unsigned)B>>1; 
        }
        return ans;
    }
};

在这里插入图片描述


插入

在这里插入图片描述

在这里插入图片描述

class Solution {
public:
    int insertBits(int N, int M, int i, int j) {
        M<<=i;//M左移i位进行对齐
        int ans=0;
        for(int k=0;k<32;++k){
            int c=(k>=i&&k<=j)?(M&(1<<k)):(N&(1<<k));//结果第k位上的数字
            ans|=c;
        }
        return ans;
    }
};

在这里插入图片描述


不用加减乘除做加法

在这里插入图片描述


解题思路:

在这里插入图片描述

class Solution {
public:
    int add(int a, int b) {
        while(b!=0){
            int c=(unsigned)(a&b)<<1; //leetcod c++不支持负值左移,需要强制转换为无符号数 
            a^=b;
            b=c;
        }
        return a;

    }
};

在这里插入图片描述


数字的补数

在这里插入图片描述

class Solution {
public:
    int findComplement(int num) {
        int tmp=num;
        int XOR=0;
        while(tmp>0){
            XOR=(XOR<<1)+1;
            tmp>>=1;
        }
        return num^XOR;

    }
};

在这里插入图片描述


数字转换为十六进制数

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

解题思路:

使用位运算,每次右移4位,对应1位16进制数字。
使用 0 x f ( 00...01111 b ) 0xf(00...01111b) 0xf(00...01111b) 获取 n u m num num 的低4位。

注意:

要去掉高位的0

class Solution {
public:
    string toHex(int num) {
        if(num==0)return "0";
        string t="0123456789abcdef";
        string ans;
        for(int i=0;i<8;++i){
            ans+=t[num&0xf];
            num>>=4;
        }
        reverse(ans.begin(),ans.end());
        int i=0;
        while(i<32){
            if(ans[i]=='0'){
                i++;
            }else{
                return ans.substr(i);
            }
        }
        return ans;
    }
};

在这里插入图片描述


位运算返回32位整数a和b中较大的

在这里插入图片描述

class Solution {
    public int flip(int x){// 1-->0    0-->1
        return x^1;
    }
    public int sign(int x){//负数-->0  0/正数-->1
        return flip((x>>31)&1); //&1 是保证溢出后依然正确
    }
    public int maximum(int a, int b) {
        int c=a-b;
        int signA=sign(a);
        int signB=sign(b);
        int signc=sign(c);
        int different=signA^signB;// a,b符号一样-->0  不一样-->1
        int same=flip(different);
        int returnA=different*signA+same*signc;
        int returnB=flip(returnA);
        return a*returnA+b*returnB;
    }
}

在这里插入图片描述




是不是2的幂

在这里插入图片描述

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param number int整型 
     * @return bool布尔型
     */
    
    public boolean is2Power (int number) {
        // write code here
        int mostRightOne=number&(~number+1);
        return number==mostRightOne;
    }
}

在这里插入图片描述



是不是4的幂

在这里插入图片描述

class Solution {
    public boolean isPowerOfTwo (int n) {
        // write code here
        int mostRightOne=n&(~n+1);
        return n==mostRightOne;
    }
    public boolean isPowerOfFour(int n) {
        if(n==0)return false;
        return isPowerOfTwo(n)&&(n& 0xaaaaaaaa)==0;

    }
}

在这里插入图片描述



二进制数含0个数

在这里插入图片描述

#include <iostream>
#include<stdio.h>
using namespace std;

int counts(int x) {//返回x的位数 11001:5位
	if(x==1||x==0)return 1;
	for (int i = 0;; ++i) {
		if ((1 << i) < x && (1 << (i + 1) )>= x)return i + 1;
	}
}

int countZero(int x) { 
	int tmp=x;
	int ans=0;
	while(tmp!=0){
		if(tmp%2==0)ans++;
		tmp=(tmp>>1);
	}
	return ans;
}
int main() {
	int N;
	cin >> N;
	int ans=0;
	for(int i=1;i<=N;++i){
		ans+=countZero(i);
	}
	cout<<ans;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值