数据结构 位运算

news2024/11/24 16:56:10

基础位运算

按位与(AND)

  • 操作符:&
  • 两个位同时位1时,结果位1,否则为0

按位或(OR)

  • 操作符:|
  • 主要有一位是1,那么结果就是1,只有两位都是0的时候,结果才是0

按位异或(XOR)

  • 操作符:^
  • 当两个位不同的时候(一位是0,另一位是1)的时候,结果为1,否则都为0 

按位取返(NOT)

  • 操作符:~
  • 将每个位都取反,0变1,1 变0

左移

  • 操作符:<<
  • 所有位向左移动指定位数,然后右边补0 

右移

  • 操作符:>>
  • 将所有位向右移动指定的位数,对于无符号树左边补0,对于有符号的数则补充符号位的值(正数补0,负数补1) 

常用位计算

给一个数n,确定它的二进制表示中的第x位是0还是1

  • 掩码生成:1 << (x - 1) 将 1 左移 x-1 位,生成一个只有第 x 位为 1 的掩码。例如,x = 3 时,生成的掩码为 0100
  • 按位与操作n & mask 会保留 n 中第 x 位的值,并将其它位设为 0。如果结果不等于 0,说明第 x 位为 1

#include <iostream>

bool checkBit(int n, int x) {
    // 生成掩码,1 左移 (x-1) 位
    int mask = 1 << (x - 1);
    // 按位与操作,检查第 x 位
    return (n & mask) != 0;
}

int main() {
    int n = 13;  // 二进制表示为 1101
    int x = 3;

    if (checkBit(n, x)) {
        std::cout << "第 " << x << " 位是 1" << std::endl;
    } else {
        std::cout << "第 " << x << " 位是 0" << std::endl;
    }

    return 0;
}

将一个数n的二进制表示的第x位修改成1

  • 生成一个只有第 x 位为 1 的掩码:将 1 左移 (x-1) 位。
  • N 与这个掩码进行按位或操作:这样可以确保 N 的第 x 位被设置为 1,而不影响其他位的值

#include <iostream>

int setBitToOne(int N, int x) {
    // 生成掩码,1 左移 (x-1) 位
    int mask = 1 << (x - 1);
    // 按位或操作,设置第 x 位为 1
    return N | mask;
}

int main() {
    int N = 13;  // 二进制表示为 1101
    int x = 2;

    int result = setBitToOne(N, x);

    std::cout << "修改后的结果是: " << result << std::endl;  // 输出修改后的数值
    //std::cout << "二进制表示: " << std::bitset<8>(result) << std::endl;  // 输出二进制表示

    return 0;
}

将一个数n的二进制表示的第x位修改成0

  • 生成一个只有第 x 位为 1 的掩码:将 1 左移 (x-1) 位。
  • 对掩码取反:将掩码的第 x 位变成 0,其他位变成 1
  • N 与取反后的掩码进行按位与操作:这样可以将 N 的第 x 位设置为 0,而不影响其他位的值

#include <iostream>

int clearBitToZero(int N, int x) {
    // 生成掩码,1 左移 (x-1) 位
    int mask = 1 << (x - 1);
    // 对掩码取反,然后与 N 进行按位与操作
    return N & ~mask;
}

int main() {
    int N = 13;  // 二进制表示为 1101
    int x = 3;

    int result = clearBitToZero(N, x);

    std::cout << "修改后的结果是: " << result << std::endl;  // 输出修改后的数值

    return 0;
}

提取一个数n二进制表示中最右侧的1

  • -nn 的二进制补码表示,实际上等于 ~n + 1
  • n & -n 的结果保留了 n 中最右侧的 1,其余位都被置为 0

#include <iostream>

int extractRightmostOne(int n) {
    return n & -n;
}

int main() {
    int n = 18;  // 二进制表示为 10010

    int result = extractRightmostOne(n);
    
    std::cout << "最右侧的1: " << result << std::endl;  // 输出结果
    std::cout << "二进制表示: " << std::bitset<8>(result) << std::endl;  // 输出二进制表示

    return 0;
}

删除一个数n二进制表示中最右侧位的1

  • n 减去 1n 最右侧的 1 以及它右边的所有位都会被翻转。
  • nn-1 进行按位与操作,会清除掉 n 最右侧的 1,并保持其他位不变

#include <iostream>

int clearRightmostOne(int n) {
    return n & (n - 1);
}

int main() {
    int n = 18;  // 二进制表示为 10010

    int result = clearRightmostOne(n);

    std::cout << "清除最右侧的1后的结果: " << result << std::endl;  // 输出结果

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 115类和对象_this指针的用途

学习内容 类和对象_this指针的用途 1.解决名称冲突 2.返回对象本身用 *this 运行结果 代码 #include<iostream> using namespace std;//cout 在这里&#xff0c;没有它会报错//1.解决名称冲突//2.返回对象本身用 *thisclass Person { public:Person(int age){//形参名称…

【深度学习实践】基于深度学习的图像去雾算法-ChaIR-实践

本文介绍一个去雾算法ChaIR的使用方法&#xff0c;可以完成图像去雾&#xff0c;也可以用于图像去雨、去噪音等任务。本文不涉及论文原理&#xff0c;只包含源代码的跑通和使用。 先展示一下效果&#xff1a; 原图去雾 论文&#xff1a;Exploring the potential of channel …

ZAN与Mysten Labs合作推进Web3基础设施开发

Mysten Labs是一家Web3基础设施公司&#xff0c;也是Sui区块链的开发公司&#xff0c;今天宣布与蚂蚁数字科技的技术品牌ZAN建立合作伙伴关系。 通过整合Sui&#xff0c;ZAN旨在加速其Web3应用程序的开发和采用。该合作将专注于为Mysten Labs在两个关键领域提供技术支持&#…

Redis 缓存预热、雪崩、穿透、击穿

缓存预热 缓存预热是什么 缓存预热就是系统上线后&#xff0c;提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候&#xff0c;先查询数据库&#xff0c;然后再将数据缓存的问题&#xff01;用户直接查询事先被预热的缓存数据&#xff01;解决方案 使用 PostConstr…

day2-网络连接网卡配置原理

1.window网卡 理解&#xff1a; window 有 2 块网卡 本地网卡 192.168.13.253 用于连接外网 vmnet8 10.0.0.1(装虚拟机自动生成的 如果没有自动生成…) 虚拟机添加 2 块网卡&#xff1a; 第一块网卡 NAT 模式 添加网卡的时候设置 NAT 模式 2 个作用&#xff0c;用于连接 wi…

Linux服务管理-Nginx进阶

通常会通过rewrite将用户的80请求转化为443请求&#xff0c;也就意味着Nginx需要去做虚拟主机&#xff0c;一个80端口的虚拟主机和一个443端口的虚拟主机&#xff0c;当访问80端口的虚拟主机时返回一个信息让用户去访问443端口的虚拟主机。

技术证书认证-附考试答案-AIGC与大模型通识-英特尔大湾区科技创新中心证书认证

目录 课程简介 面向人群 考核步骤 试题答案 知孤云出岫主页 课程以及考试链接&#xff1a;AIGC与大模型通识 - 英特尔大湾区科技创新中心 【英特尔大湾区科技创新中心】公益新课《AIGC与大模型通识》上线官网&#xff01;首期结业认证进行中&#xff0c;提升AI应用技能&…

解决Element-ui el-tree数据与显示不对应的问题

如图&#xff1a; 后端返回的权限列表&#xff0c;并没有列表这一项&#xff0c;但是由于父节点 版本打包 为选中状态&#xff0c;导致所有子节点都为选中状态。 实现代码如下&#xff1a; <el-treeref"tree":data"records"show-checkboxnode-key&quo…

RuoYi-Vue新建模块

一、环境准备 附:RuoYi-Vue下载与运行 二、新建模块 在RuoYi-Vue下新建模块ruoyi-test。 三、父pom文件添加子模块 在RuoYi-Vue的pom.xml中,引入子模块。 <dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-test</artifactId>&…

【AI人工智能】文心智能体 - 你的专属车牌设计师

引言 自AI盛行以来&#xff0c;不断有各种各样的人工智能产品崭露头角。我们逐步跟着不断产生的人工智能来使自己的工作和生活变得更加智能化&#xff01;那么我们是否能够创造一款专属于自己的人工智能产品呢&#xff1f; 文心智能体平台就给我们提供了这样的机会&#xff0c…

品牌维价的含义和方法

品牌维价是指通过一系列手段和方法&#xff0c;对品牌产品的价格进行统一管理和控制&#xff0c;确保品牌在各个销售渠道都能保持合理稳定的价格体系&#xff0c;从而保障品牌自身以及各级经销商的合理利润。 常见的品牌维价方法可以参考下面这些 品牌自我管控的方法&#xff…

8.2.数据库基础技术-数据模型

概念模型是从用户的角度进行建模的&#xff0c;是现实世界到信息世界的第一抽象&#xff0c;是真正的实体-联系模型。关系模型是二维表的形式表示的实体-联系模型&#xff0c;是将实体-联系模型转换而来的&#xff0c;经过开发人员设计的&#xff1b;网状模型表示实体类型及其实…

【背包蛙】游戏 高端链游 链游开发

#游戏#链游 #深圳软件开发公司#游戏开发公司 以背包整理和物品摆放为核心的策略博弈 那么以背包中的物品&#xff0c;我们就开始了冒险之旅——角色固定拥有3点AP&#xff0c;盾牌或者剑以及后续获得的其他武器&护甲使用绝大部分都需要AP(也包含很多伤害低&次数也受限…

计算数学精解【12】-fortran计算精解(1)

文章目录 概述hello,world环境接收输入与输出 读取csv文件if and select case循环formatread,write format 概述 FORTRAN是英文“FORmulaTRANslator”的缩写&#xff0c;译为“公式翻译器”&#xff0c;它是世界上最早出现的计算机高级程序设计语言&#xff0c;广泛应用于科学…

2024.8.13-算法学习(原创+转载)

一、什么是张量并行&#xff08;Tensor Parallelism&#xff09; &#xff1f; 张量并行&#xff08;Tensor Parallelism&#xff09; 是一种分布式矩阵算法。 随着模型越来越大&#xff0c;模型内的矩阵也越来越大。一个大矩阵的乘法可以拆分成多个小矩阵的运算&#xff0c;…

文件上传漏洞(四,靶场详解)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 靶场环境搭建及pass-1.pass-2请转到&#xff1a; 文件上传漏洞&#xff08;二&#xff0c;靶场搭建及漏洞利用&#xff09; 文件上传漏洞&#xff08;三&#xff0c;靶场详解…

【机器学习西瓜书学习笔记——半监督学习】

机器学习西瓜书学习笔记【第十二章】 第十三章 半监督学习13.1 未标记样本13.2 生成式方法13.3 半监督 S V M SVM SVM基本思想优点和注意事项适用场景 13.4 图半监督标签传播算法多类标签传播算法Label PropagationLabel Spreading 13.5 基于分歧的方法数据视图协同训练 13.6 半…

映客基于Apache SeaTunnel 打造高效的一站式数据集成平台

背景 随着业务的增加&#xff0c;数据集成任务大量增长&#xff0c;越来越多的数据源的需要支持&#xff0c;原有的系统已经无法完全支撑现有体量。 现有的数据集成平台短板慢慢展现导致部分业务线无法快速对接。数据源的架构在变得繁多和复杂,数据应用也逐渐变得更加垂直和场…

opencv-python图像增强四:多曝光融合(方法一)

文章目录 一、简介&#xff1a;二、多曝光融合方案&#xff1a;三、算法实现步骤3.1 读取图像与曝光时间&#xff1a;3.2 计算响应曲线并合并3.3 色调映射 四&#xff1a;整体代码实现五&#xff1a;效果 一、简介&#xff1a; 在摄影和计算机视觉领域&#xff0c;高动态范围&…

关于IP子网掩码的解释

关于IP子网掩码的解释 1、掩码 10.1.1.0/27 掩码 10.1.1.0/27 表示一个子网&#xff0c;其中/27是子网掩码的表示方式&#xff0c;指的是前27位是网络位&#xff0c;剩下的5位是主机位&#xff0c;这种掩码意味着每个子网有32个IP地址(2^532)&#xff0c;其中包括一个网络地址…