位运算基础

简介: 本文由blue编写,发布于2024年3月,主要讲解位运算的基础知识及其应用。内容涵盖计算二进制中1的个数、`x & -x`运算规则及其实用场景(如获取LowBit)、与、或、非、异或运算的定义与妙用,以及左移和右移操作。通过实例代码展示了如何利用位运算解决实际问题,例如信号灯灯管变化模拟。适合初学者学习位运算的核心概念与技巧。

位运算基础

作者:blue

时间:2024.3

1.计算二进制中1的个数

n=n&(n-1) //用就完了
#include <iostream>
using namespace std;
int count(int n)
{
   
    int sum=0;
    while(n)
    {
   
        n=n&(n-1);
        sum++;
    }
    return sum;
}
int main()
{
   
    int n;
    int sum=0;
    cin>>n;
    sum=count(n);
    printf("%d",sum);
    return 0;
}

应用:0二进制问题 - 蓝桥云课 (lanqiao.cn)

虽然有一半的测试数据会超时,但是强在代码容易写,而且不用思考,先拿一半分数再说

#include <iostream>
#define int long long
using namespace std;
int count(int n)
{
   
  int sum=0;
  while(n)
  {
   
    n=n&(n-1);
    sum++;
  }
  return sum;
}
signed main()
{
   
  int n,k;
  int ans=0;
  int sum;
  cin>>n>>k;
  for(int i=1;i<=n;i++)
  {
   
    sum=count(i);
    if(sum==k) ans++;
  }
  printf("%lld",ans);
  return 0;
}

2.位运算(x & -x)

~x:按位取反

-x 的值, 其实就是在x的值的基础上进行按位取反(~x)之后在增加1所得

x & -x == x & (~x + 1)

x 为偶数

偶数按位取反后一定是奇数,再+1,会影响进位。

0000 0100 1110, 取反后的结果就变成了 1111 1011 0001,而当这个值 + 1之后由于发生了进位, 即

1111 1011 0001 + 1 = 1111 1011 0010

这个结果再与最初的值相与后, 只会有一位保留为1

0000 0100 1110 & 1111 1011 0010 = 0000 0000 0010

如果一个偶数, 在执行 x & -x的操作的时候, 最后结果肯定有如下两个特征:

① 这个结果只有一位值是1, 其他位均是0
② 这个值的末位0的个数与原值保持一致

当一个偶数与它的负值相与时, 结果是能整除这个偶数的最大的2的幂, 即: m = n & -n , 则 n % m = 0, 且 m = 2 ^ k

x为奇数

奇数取反后的值一定是偶数, 而偶数的值 + 1之后, 并不会影响进位

所以进行x&-x后,剩下刚加上的那最后一位1

结论:“如果是x是奇数, 那x & -x 的结果一定是1

最终结论

当一个数与其取负后的值相与, 如果这个数是偶数, 则结果是能整除这个偶数的最大的2的幂(即: m = n & -n , 则 n % m = 0, 且 m = 2 ^ k), 如果这个数是奇数, 则结果必为1

用途: 一般可以用来获取某个二进制数的LowBit

lowbit ( n ) 定义为非负整数 n 在二进制表示下 “ 最低位的 1 及其后面的所有的 0 ” 的二进制构成的数值。

int lowbit(int x)
{
   
    return x&(-x);
}

8.位运算(与,或,非,异或)

与运算运算符号为 & ,运算法则为遇0得0。也就是说只要有0,结果即为0

举例:1001 & 1100

    1 0 0 1
      &
    1 1 0 0
    ————
    1 0 0 0

妙用(x&1)可以用来判断二进制数x最后一位是不是1,是1就为1,不是1则为0;

可以用来快速判断奇偶数。

或运算运算符号为 | ,就是一个竖线,运算法则为遇1得1。也就是说,只要有1,结果就为1。

举例:1100 | 1010

    1 1 0 0
      |
    1 0 1 0
    ————
    1 1 1 0

非运算预算符号为 ~,就是一个波浪线,运算法则为按位取反,也就是遇1取0,遇0取1,即 ~1 = 0 , ~0 = 1;

举例: ~1001

    1 0 1 1
     ~
    ————
    0 1 0 0

异或运算运算符号为 ^,就是一个乘方符号,运算法则为相同取0,不同取1。异或运算,关键在异上面,异为1,否则为0

举例:1001 ^ 1001

    1 0 1 1
     ^
    1 0 0 1
    ————
    0 0 1 0

左移与右移

<<左移

很简单的来说就是把当前的二进制,整体往左边移动N个单位,N取决于你的表达式。

例如:32 << 1 = 64。
>>右移

很简单的来说,把当前的二进制,整体往右边移动N的单位,得到一个新的二进制。

例如:32 >> 1 = 16

image-20240310125759384.png

//用二进制数来表示信号灯的7个灯管,用异或运算来模拟灯管的变化
#include <stdio.h>
#include <string.h>
const int N = 1e5 + 1;
int check(int x)
{
   
    int num=0;
    while(x)
    {
   
        num += (x & 1);
        x = x >> 1;
    }
    return num;
}
int main()
{
       
               //abcdefg
    int pos[] = {
    0B1111110,
               0B0110000,
               0B1101101,
               0B1111001,
               0B0110011,
               0B1011011,
               0B1011111,
               0B1110000,
               0B1111111,
               0B1111011 };
    int i, len;
    int ans = 0;
    char s[N], t[N];
    scanf("%s", s);
    scanf("%s", t);
    len = strlen(s);
    for(i=0;i<len;i++)
    {
   
        ans += check(pos[s[i] - '0'] ^ pos[t[i] - '0']);
    }
    printf("%d", ans);
    return 0}
目录
相关文章
|
弹性计算 Kubernetes 数据处理
KubeRay on ACK:更高效、更安全
阿里云 ACK 以托管组件化的方式给客户提供快速搭建Ray集群的能力,并通过结合使用阿里云的调度,存储,日志与监控,给用户提供更佳使用体验。
|
2月前
|
SQL Java 数据库连接
菜鸟之路Day34一一Mybatis-基础操作
本文介绍了MyBatis的基础操作,包括删除、插入、修改和查询功能的实现。通过`@Delete`、`@Insert`、`@Update`和`@Select`注解完成对应操作,支持主键自动生成与返回。同时探讨了`#{}`和`${}`的区别,前者用于预编译SQL提升安全性,后者直接拼接但存在SQL注入风险。文章还提供了根据ID查询及条件查询的示例,并介绍了实体类属性与数据库字段不一致时的解决方案,如使用驼峰命名规则或配置映射关系,确保数据封装准确。
106 32
|
1月前
|
算法 IDE 开发工具
蓝桥杯备赛经验帖
本文是作者blue分享的蓝桥杯备赛经验帖,旨在帮助刚接触算法竞赛的新手。文章从个人参赛经历出发,详细介绍了蓝桥杯的OI赛制特点、比赛流程以及备赛建议。作者强调了重点掌握基础数论、DFS、数组操作、二分法、动态规划等知识,并建议多参与线上赛,熟悉输入输出规则,同时避免盲目刷题或过度依赖力扣。通过参赛,作者不仅提升了编码能力,还结识了优秀的朋友,认识到自身差距,激励自己不断进步。此经验适合新手参考,大佬可略过。
203 4
|
2月前
|
存储 设计模式 缓存
OkHttp源码解析(小白必看,建议收藏)
本文详细解析了OkHttp3的源码及其实现机制,适合初学者学习。文章从Request与Response结构、HTTPS握手过程、响应码含义、Socket概念到责任链模式的应用逐一讲解。重点分析了OkHttp的工作流程:通过Call对象的enqueue()或execute()方法发起请求,核心是getResponseWithInterceptorChain(),利用拦截器链处理请求,包括用户自定义拦截器、重试、桥接、缓存、连接等步骤。最后还探讨了Dispatcher的任务调度机制。
487 71
|
2月前
|
存储 人工智能 Kubernetes
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,是用户在云上存储的高性价比选择…
|
1月前
|
人工智能 智能设计 算法
浙江大学联合阿里云举办的全国高校人工智能师资素养提升交流活动圆满结束丨云工开物
为推动人工智能与教育深度融合,浙江大学联合阿里云举办“2025年全国高校人工智能师资素养提升交流活动”。活动吸引121所高校及单位的579名教师参与,通过项目实例讲解、平台实践训练等方式,助力教师掌握AI技术并融入教学。活动中,浙江大学与阿里云专家分享了前沿技术和应用案例,参访浙大艺博馆与阿里云展厅,并完成AIGC辅助设计实训。未来,双方将持续推进数字化技能培训,支持高校AI人才培养。
|
2月前
|
机器学习/深度学习 人工智能 安全
基于YOLOv8的路面缺陷(路面裂缝、井盖、坑洼路面)识别项目【完整源码数据集+PyQt5界面+完整训练流程+开箱即用!】
本项目基于YOLOv8与PyQt5,打造路面缺陷检测系统,支持裂缝、井盖、坑洼识别,涵盖图片、视频、摄像头等多种输入方式。提供完整训练数据、预训练模型及图形化界面,开箱即用,本地运行,方便二次开发。适用于智慧城市建设与道路安全巡检,推动AI检测技术实际应用。项目包含源码、数据集、训练代码,支持科研学习与工程实战。
218 15
基于YOLOv8的路面缺陷(路面裂缝、井盖、坑洼路面)识别项目【完整源码数据集+PyQt5界面+完整训练流程+开箱即用!】
|
2月前
|
人工智能 小程序 API
DeepSeek‑R1-0528 重磅升级:蚂蚁百宝箱免费、无限量调用
DeepSeek-R1-0528 版本重磅升级,推理能力显著增强,在数学、编程和通用逻辑等基准测评中表现卓越,媲美国际顶尖模型。此次更新提供免费、无限量调用通道——蚂蚁百宝箱,用户可通过简单五步构建智能体并发布至多端平台。模型基于 DeepSeek V3 Base,参数规模达 685B,上下文长度最高支持 128K,助力开发者快速嵌入顶尖推理能力,打造创新应用。立即访问蚂蚁百宝箱体验!
209 11
|
1月前
|
人工智能 Cloud Native 数据管理
邀您参加 KubeCon China 2025 分论坛 | 阿里云 AI 基础设施技术沙龙
KubeCon + CloudNativeCon China 2025 将于6月10-11日在香港合和酒店举办,由CNCF与Linux基金会联合主办。阿里云开发者将在大会上分享多个技术议题,涵盖AI模型分发、Argo工作流、Fluid数据管理等领域。大会前还有阿里云AI基础设施技术沙龙,聚焦AI基础设施及云原生技术实战经验。欢迎扫码报名参与!
287 65
|
1月前
|
机器学习/深度学习 人工智能 算法
通义OmniAudio大模型,让 AI 看懂 360° 视频,并“听”出对应的空间音频
OmniAudio 是一项突破性的空间音频生成技术,能够直接从 360° 视频生成 FOA(First-order Ambisonics)空间音频,为虚拟现实和沉浸式娱乐带来全新可能。通过自监督 coarse-to-fine 预训练和双分支视频表示微调,OmniAudio 在非空间音频质量和空间定位准确性上显著优于现有方法。项目包含超过 103,000 个视频片段的 Sphere360 数据集,支持高质量的模型训练与评估。代码、数据及论文均已开源,助力沉浸式体验技术发展。
286 62