首页 > 其他分享 >位运算

位运算

时间:2024-12-09 15:57:48浏览次数:4  
标签:const 运算 val int auto eor bits

[Algo] 位运算

1. 出现奇数次的数①

// 1. 一个数组中,只有一种数A出现过奇数次,其余数都出现过偶数次,问A?
int oddNumber(const vector<int> &v)
{
    int eor = 0;
    for (const auto &e : v) eor ^= e;
    return eor;
}

2. 出现奇数次的数②

// 2. 一个数组中,只有两种数A与B出现过奇数次,其余数都出现过偶数次,问A与B?
pair<int, int> oddNumbers(const vector<int> &v)
{
    int eor = 0;
    for (const auto &e : v) eor ^= e; // eor = A ^ B
    int rightOne = eor & (-eor); // 获取二进制状态中最后一个1
    int eor0 = 0;
    for (const auto &e : v) eor0 = (e & rightOne) == 0 ? eor0 ^ e : eor0; // 通过该二进制位的状态分离A与B
    return make_pair(eor0, eor ^ eor0); 
}

3. 连续与运算

// 3. 返回[A,B]依次与运算的结果
int continuousAnd(int A, int B)
{
    while (A < B) B -= B & (-B);
    return B;
}

4. 二进制状态的逆序

// 4. 返回一个数二进制状态的逆序
unsigned int binaryReverse(unsigned int val)
{
    val = ((val & 0xaaaaaaaa) >> 1) | ((val & 0x55555555) << 1); // 2个为一组进行交换
    val = ((val & 0xcccccccc) >> 2) | ((val & 0x33333333) << 2); // 4个为一组进行交换
    val = ((val & 0xf0f0f0f0) >> 4) | ((val & 0x0f0f0f0f) << 4); // 8个为一组进行交换
    val = ((val & 0xff00ff00) >> 8) | ((val & 0x00ff00ff) << 8); // 16个为一组进行交换
    val = ((val & 0xffff0000) >> 16) | ((val & 0x0000ffff) << 16); // 32个为一组进行交换
    return val;
}

5. 二进制状态中1的个数

// 5. 返回一个数二进制状态中1的个数
unsigned int binaryOnes(unsigned int val)
{
    val = (val & 0x55555555) + ((val & 0xaaaaaaaa) >> 1); // 2个为一组进行计数
    val = (val & 0x33333333) + ((val & 0xcccccccc) >> 2); // 4个为一组进行计数
    val = (val & 0x0f0f0f0f) + ((val & 0xf0f0f0f0) >> 4); // 8个为一组进行计数
    val = (val & 0x00ff00ff) + ((val & 0xff00ff00) >> 8); // 16个为一组进行计数
    val = (val & 0x0000ffff) + ((val & 0xffff0000) >> 16); // 32个为一组进行计数
    return val;
}

* 基数排序(补)

// 基数排序 时间复杂度为O(m*(n+r)),空间复杂度为O(n+r)
void radixSort(vector<int> &v, int bits)
{
    // 总共m(bits)轮
    for (int offset = 1; bits > 0; bits--, offset *= 10)
    {
        vector<int> cnts(10);
        for (const auto &e : v) cnts[e / offset % 10]++;
        for (int i = 1; i < cnts.size(); i++) cnts[i] += cnts[i - 1];
        vector<int> help(v);
        for (int i = v.size() - 1; i >= 0; i--) help[--cnts[v[i] / offset % 10]] = v[i];
        v = help; 
    }
}
void RadixSort(vector<int> &v)
{
    // 需要处理存在负数的情形
    auto min_it = min_element(v.begin(), v.end());
    int min_val = *min_it;
    for (auto &e : v) e -= min_val;
    // 计算最大值的位数
    auto max_it = max_element(v.begin(), v.end());
    int max_val = *max_it;
    int bits = 0;
    while (max_val > 0)
    {
        max_val /= 10;
        bits++;
    }
    radixSort(v, bits);
    for (auto &e : v) e += min_val;
}

标签:const,运算,val,int,auto,eor,bits
From: https://www.cnblogs.com/yaoguyuan/p/18595144

相关文章

  • C# 探险之旅:第五节 - 布尔运算:真假美猴王的逻辑大战
    嘿,勇敢的探险家们!欢迎再次踏上我们的C#奇妙之旅。今天,我们要进入一片神秘而充满逻辑的森林——布尔运算的王国。想象一下,你不仅是一位编码勇士,还是一位判断真假的福尔摩斯,让我们一起揭开“布尔运算”的神秘面纱吧!什么是布尔运算?在编程的世界里,布尔运算就像是侦探手中的放大镜......
  • 【算法】【优选算法】位运算(上)
    目录一、位运算简介及常用操作二、191.位1的个数三、338.比特位计数四、461.汉明距离五、136.只出现一次的数字六、260.只出现一次的数字III一、位运算简介及常用操作基础位运算:右移:>>左移:<<按位取反:~按位与:&:有0就是0按位或:|:有1就是1按位异或:^:相同为0......
  • C语言的常用标准数据类型、转义字符、输出格式符、输入格式符、算术运算符、关系运算
    目录 C语言的常用标准数据类型C语言的常用转义字符C语言的输出格式符C语言的输入格式符C语言的算术运算符C语言的关系运算符C语言的逻辑运算符 C语言的常用标准数据类型C语言的常用转义字符‘\n’       换行符‘\t’       制表符‘\b’ ......
  • 【C++算法】33.位运算_判定字符是否唯一
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:面试题01.01.判定字符是否唯一题目描述:解法如果使用数据结构的话哈希表:一个一个字符扫描,不在哈希表里面的就放进去,在里面的就返回false。扫描完全部不重复就返回true。也可以优化一下,字母一共26......
  • 【C++算法】34.位运算_丢失的数字
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:268.丢失的数字题目描述:解法哈希表创建一个0~5的数组从前往后遍历一下,有的数字就在表里面标记一下,最后看一下哪些数字没有被标记过。高斯求和先求出应该有的和:(首项+末项)*项数÷2然后减去数组的和......
  • 用requests对象设计实现一个简单的计算加减乘除运算的网页程序
    为了实现一个简单的网页计算器程序,能够进行加、减、乘、除运算,我们可以使用`Flask`(一个轻量级的PythonWeb框架)来创建网页应用,并结合`requests`对象来处理用户通过表单或URL参数提交的运算请求。###项目结构假设我们的项目结构如下:```calculator_app/│├──app.py#Fla......
  • 那些算法中很重要,却总是被你忽略的小技巧,快来看看你和大佬之间的差距吧(位运算)
    1.除法(乘法)转位运算当x的除数(乘数)是2的n次方时,可以转化为x右移(左移)n位x/pow(2,n)==(x>>n)或者x*pow(2,n)==x<<n 因为数据在计算机中通常用2进制表示,位运算通常比乘除效率高的多2.按位与(&)确定资源计算机中通常用一段二进制来确定对应的资源或者空间充裕 例如:在......
  • leetcode 3266. K 次乘运算后的最终数组 II
    3266.K次乘运算后的最终数组II给你一个整数数组 nums ,一个整数 k  和一个整数 multiplier 。你需要对 nums 执行 k 次操作,每次操作中:找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。将 x 替换为 x*multiplier 。k 次操作以......
  • GPU运行模式下(SIMD)—— 为什么在GPU下分支运算的效率极为低下 —— What's up with my
    相关:https://aschrein.github.io/jekyll/update/2019/06/13/whatsup-with-my-branches-on-gpu.html#tldr具体内容参照原文:https://aschrein.github.io/jekyll/update/2019/06/13/whatsup-with-my-branches-on-gpu.html......
  • C++学习日记---第18天(5k字 重载运算符快速通关)
    (本文包含了从基础到中等的运算符重载内容,以及一些在编写代码时可能遇到的问题) 笔记复习1.运算符重载以代码实现一个类的两个对象相加为例#include<iostream>usingnamespacestd;classperson{ intm_deposit=1000; intincome=100;};intmain(){ person......