第7天----【位运算进阶之----位或(|)】七夕特别版

news2025/1/8 4:30:15

❤️今天我们来学习位或
注意:本文中的位是从右往左来说的,也就是从低位开始数的!!!


一、昨日重现:

  • 当然,在正式学习之前,让我们先看看昨天留下的问题:⭐️如何判断一个数是不是2的幂❓

✨要想解决这个问题,我们先要搞清楚,2的幂有什么特征?

2的幂十进制表达二进制表达
2^010001
2^120010
2^240100
2^381000

✨我们简单地列举出几个2的幂的二进制表达,可以发现,只有一位是1(且是首位),其余位全部是0。利用昨天学过的位与(&)知识,全1才1,有0则0,因此,将(2^n) & (2^n-1),结果必定是0,从而得到判断一个数是否是2的幂的方法之一:

if ( (n)&(n-1)==0 )  cout<<"n是2的幂";

二、基础知识:

✨C语言中的位或运算符|是一种按位逻辑运算符,用于对两个操作数每个位执行逻辑或操作。位或操作的结果是两个操作数的每个对应位进行逻辑或运算后的值。

位或运算符的使用方法如下:

result = operand1 | operand2;
  • 其中,operand1operand2是要进行位或运算的两个操作数,result是运算结果。

位或运算的规则如下:

  • (全0才0) 如果两个操作数的对应位都为0,则结果位为0。
  • (有1则1) 如果两个操作数的对应位有一个为1,则结果位为1。

(😄是不是和逻辑或很像呢❓)
示例如下:

#include <stdio.h>

int main() {
   unsigned int a = 5;  // 二进制表示为 0101
   unsigned int b = 9;  // 二进制表示为 1001
   unsigned int result = a | b;  // 二进制表示为 1101,十进制表示为 13

   printf("result: %u\n", result);

   return 0;
}
  • 在上面的例子中,我们使用了两个无符号整数变量ab,它们的二进制表示分别为01011001。通过对这两个变量进行位或运算,我们得到了结果1101,它的十进制表示为13。

三、拓展应用:

在这里插入图片描述

1. 设置特定位:

✨可以使用位或运算将某个变量的特定位设置为1,而不影响其他位的值。例如,可以使用位或运算设置标志位、控制位或权限位。

示例如下::

#include <stdio.h>

int main() {
   unsigned int flags = 0;  // 所有位都为0
   unsigned int mask = 1;   // 二进制表示为 0001

   flags = flags | mask;    // 将最低位设置为1

   printf("flags: %u\n", flags);

   return 0;
}
  • 在上面的例子中,我们使用了一个无符号整数变量flags,它的所有位都为0。然后,我们定义了一个二进制表示为0001的掩码mask。通过对flagsmask进行位或运算,我们将flags的最低位设置为1。最终,flags的值变为1。

拓展思考:

❤️怎么将任意二进制的特定位置为1呢?置为0又该怎么做?
解:

  • ✨我们首先来看第一个问题,将任意二进制的特定位置为1
    我这里有两种方法:
    💗方法一:利用位或的思想
    要将一个二进制数的第n位(从右往左,即从低位开始数)置为1,则只需要将该二进制数与2^(n-1)位或即可。比如对1001来说,要将第三位置为0,只需要将其与100(即4=2 ^(3-1))位或即可。
    💗方法二:加法
    先将该位置为0,再加上2^(n-1);

  • ✨对于第二个问题,将任意二进制的特定位置为0,解法与第一个问题类似。
    💗方法一:利用位与的思想
    将该数和111…101…111位与(这个二进制数只有特定位上是0,其余都是1)。比如要将1011第2位置为0,只需将其和1101位与即可。
    💗方法二:减法
    先将该位置为1,再减去2^(n-1);

❤️怎么将低位连续的0置为1呢?
解:对于11110000来说,要想将低位的4给零都置为1,只需要将其和11101111位或即可。也就是n|(n-1).(这是一种特殊情况)

❤️怎么将低位的第一个零置为1呢?
解:对于11110111来说,要想将低位的第一个0置为1,只需要将其和11111000位或即可。也即n|(n+1).(普遍情况)


2. 权限控制:

✨可以使用位或运算将不同的权限组合在一起。例如,可以使用不同的位代表不同的权限,然后通过位或运算将多个权限合并在一起。

#include <stdio.h>

#define READ_PERMISSION  1   // 二进制表示为 0001
#define WRITE_PERMISSION 2   // 二进制表示为 0010
#define EXECUTE_PERMISSION 4 // 二进制表示为 0100

int main() {
   unsigned int permissions = 0;

   permissions = permissions | READ_PERMISSION;   // 设置读权限
   permissions = permissions | WRITE_PERMISSION;  // 设置写权限

   printf("permissions: %u\n", permissions);

   return 0;
}
  • 在上面的例子中,我们使用了一个无符号整数变量permissions,它的所有位都为0。然后,我们定义了三个不同的权限标志,分别代表读权限、写权限和执行权限。通过对permissions和相应的权限标志进行位或运算,我们将读权限和写权限合并在一起。最终,permissions的值变为3。

3. 掩码操作:

✨可以使用位或运算来创建一个掩码,用于提取或设置特定的位。掩码是一个二进制数,其中每个位对应于要提取或设置的位。通过将掩码与另一个数进行位与或位或运算,可以提取或设置特定的位。(一般是位与)

#include <stdio.h>

#define BIT_MASK 0x0F  // 二进制表示为 00001111

int main() {
   unsigned int value = 0x3A;  // 二进制表示为 00111010

   unsigned int maskedValue = value & BIT_MASK;

   printf("maskedValue: %u\n", maskedValue);

   return 0;
}
  • 在上面的例子中,我们使用了一个无符号整数变量value,它的二进制表示为00111010。然后,我们定义了一个掩码BIT_MASK,它的二进制表示为00001111。通过对value和掩码进行位与运算,我们提取了value的低4位。最终,maskedValue的值变为10。

4. 位标志:

✨可以使用位或运算来创建一个包含多个位标志的变量。每个位标志代表一个特定的状态或属性。通过位或运算将多个位标志合并在一起,可以在一个变量中同时表示多个状态或属性。(和权限控制有点类似)

#include <stdio.h>

#define FLAG_A 1   // 二进制表示为 0001
#define FLAG_B 2   // 二进制表示为 0010
#define FLAG_C 4   // 二进制表示为 0100

int main() {
   unsigned int flags = 0;

   flags = flags | FLAG_A;   // 设置标志A
   flags = flags | FLAG_B;   // 设置标志B

   printf("flags: %u\n", flags);

   return 0;
}
  • 在上面的例子中,我们使用了一个无符号整数变量flags,它的所有位都为0。然后,我们定义了三个不同的标志,分别代表标志A、标志B和标志C。通过对flags和相应的标志进行位或运算,我们将标志A和标志B合并在一起。最终,flags的值变为3。

5.位运算优化:

✨有时,使用位或运算可以优化代码的执行效率。例如,可以使用位或运算来替代一些复杂的逻辑运算,从而减少计算量和执行时间。


😄好了,今天的讲解就到这里了,相信你也是收获满满吧!

附一张漂亮的流星雨照片:(许愿.gif)
在这里插入图片描述

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

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

相关文章

二阶段——堆叠技术

堆叠技术——可以将多台真的物理设备逻辑上抽象成一台 思科——VPC 华为——IStack和CSS 华三——IRF 锐捷——VSU iStack和CSS的区别 CSS----集群---它仅支持将两台支持集群的交换机逻辑上整合成为一台设备 IStack---堆叠--可以将多台支持堆叠的交换机逻辑上整合成为一…

echarts三个月份数据对比图 实现思路

legend展示数据与tooltips数据不一致 先看结果&#xff1a;展示出来的legend 鼠标滑过当前日期展示的tooltips数据 这里的难点就是前两个月份的数据如何渲染上去到tooltips中&#xff0c;前两个月份的数据不在echarts的展示列。不能常规的series渲染。 后端给的数据&#xff…

Vue 3 常见面试题汇总

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前言 最近两年许多大厂都在实行“降本增效”、“优化组织架构”&#xff0c;然后“为社会输送了大量人才”&#xff0c;今年&#xff08;2023&#xff…

单独说一下联合主键和组合索引

联合主键 mysql中,连点两个主键, 试验结果发现 只有当id 和 math 都一样时才会报主键重复, 这个就是联合主键 组合索引 mysql中,有一个主键了, 然后我自己创建了一个组合索引,这个索引是由math和sex两个列组成的. 试验结果发现 当math 和 sex都一样时会报重复错误.

穿起“新架构”的舞鞋,跳一支金融数字化转型的华尔兹

华尔兹&#xff0c;是男女两位舞者&#xff0c;通过形体的控制&#xff0c;舞步技巧的发挥&#xff0c;完美配合呈现而出的一种舞蹈形式。华尔兹舞姿&#xff0c;如行云流水、潇洒自如、飘逸优美&#xff0c;素有“舞中皇后”的美称。 在跳华尔兹的时候&#xff0c;如果舞者双…

想要恢复苹果删除的视频,一定不要错过这3个方法!

我是一名博主&#xff0c;前几天去外地拍了很多素材想留着制作下期视频。但是在清理手机内存的时候可能不小心点错了&#xff0c;然后我也没仔细看&#xff0c;就把拍的素材也一起删掉了。现在找不回来了&#xff0c;有什么办法能帮帮我吗&#xff1f; 对于苹果用户来说&#x…

chatGPT界面

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…

《剑指Offer》链表题大全 9道题【9道经典链表题帮助你掌握链表】

《剑指Offer》链表题大全 9道题 链表1. 从尾到头打印链表本题考点栈 2. 在O(1)时间删除链表结点3. 删除链表中重复的节点总结&#xff1a;删除节点的两种方法1. a-》b 直接让a的值等于b的值&#xff0c;a的next等于b的next2. a-》b-》c 让a的next指向c&#xff08;只有修改next…

NineData中标移动云数据库传输项目(2023)

近日&#xff0c;玖章算术NineData智能数据管理平台成功中标《2023年移动云数据库传输服务软件项目》&#xff0c;中标金额为406万。这标志着玖章算术NineData平台已成功落地顶级运营商行业&#xff0c;并在数据管理方面实现了大规模应用实践。 NineData中标2023移动云数据库传…

解决OpenFOAM颗粒计算输出文件Paraview无法打开问题(二)

第二个方案的源是在CFD中文网上看到的一篇帖子&#xff0c;其具体链接忘了。这个帖子给了一个github的链接&#xff0c;就是将OpenFOAM输出的颗粒位置信息转变为真实的位置信息的脚本。其链接在此。 1. 背景 我们知道&#xff0c;paraview之所以打不开OF输出的颗粒文件&#…

轻松玩转70亿参数大模型!借助Walrus在AWS上部署Llama2

Llama 2 是 Meta 的下一代开源大语言模型。它是一系列经过预训练和微调的模型&#xff0c;参数范围从 70 亿到 700 亿个。Meta Llama 2 可免费用于研究和商业用途并且提供了一系列具有不同大小和功能的模型&#xff0c;因此一经发布备受关注。在之前的文章中&#xff0c;我们详…

Spring 为什么使用三级缓存解决循环依赖

文章目录 前言1. 什么是循环依赖1.1 互相依赖1.2 递归依赖 2. Sping中循环依赖有什么问题&#xff1f;3. 什么是三级缓存4. Spring 可以解决哪些情况的循环依赖&#xff1f; 二级缓存作用——普通循环依赖实操环节1. 实例化类A对象2. 实例化类B对象3. B对象完成创建4.继续创建A…

Python自动化小技巧21——实现PDF转word功能(程序制作)

案例背景 为什么这个年代PDF转word&#xff0c;某wps居然还要收费.....很多软件都可以实现这个功能&#xff0c;但是效果都有好有坏&#xff0c;而且有的还付费&#xff0c;很麻烦。 那就用python实现这个功能吧&#xff0c;然后把代码打包为.exe的程序&#xff0c;这样随便在…

SOLIDWORKS提高装配效率的方法:配合参考

SOLIDWORKS装配功能比较强大&#xff0c;但是如果产品中有较多的标准件、企业通用件等&#xff0c;由于这类零件一般量较大&#xff0c;所以装配起来费时费力。同时标准件、企业通用件等相对比较固定&#xff0c;装配方式也相对固定&#xff0c;那有没有办法让SOLIDWORKS自动装…

一文读懂设备管理系统:是什么、谁需要、怎样选

工业的迅猛发展让人类向前迈出了史无前例的步伐&#xff0c;工业4.0将我们又带入了一个信息化技术促进工业变革的新时代——智能化时代。一台台机器设备是工业发展史上必不可少的参与者&#xff0c;但企业对设备的管理存在种种痛点&#xff0c;比如生产设备多&#xff0c;但备件…

ui设计师年终总结精选五篇

2019ui设计师年终总结一 工作一年了&#xff0c;结合我自身谈谈UI设计的重要性。现在主流的论坛建站程序有两种 Phpwind 和Discuz (Phpwind被阿里巴巴收购 Discuz被腾讯收购这两个论坛程序都是开源免费的)&#xff0c;利用这两种程序我都分别建立过论坛&#xff0c;我第一次用…

拼多多app商品详情接口 获取pdd商品主图价格销量库存信息

拼多多是中国一家知名的电商平台&#xff0c;以"社交团购新零售"的商业模式闻名&#xff0c;通过手机app和微信小程序等渠道提供商品销售和购物体验。平台上的商品种类丰富多样&#xff0c;涵盖了服装、家居、美妆、食品、数码电子等各个领域。 拼多多的商业模式主要…

Java 中使用 ES 高级客户端库 RestHighLevelClient 清理百万级规模历史数据

&#x1f389;工作中遇到这样一个需求场景&#xff1a;由于ES数据库中历史数据过多&#xff0c;占用太多的磁盘空间&#xff0c;需要定期地进行清理&#xff0c;在一定程度上可以释放磁盘空间&#xff0c;减轻磁盘空间压力。 &#x1f388;在经过调研之后发现&#xff0c;某服务…

qq windows版客户端0day复现——远程代码执行(七夕小礼物)

##ps&#xff1a;本文章仅用来分享&#xff0c;请勿将文章内的相关技术用于非法目的&#xff0c;请勿将文章内的相关技术用于非法目的&#xff0c;请勿将文章内的相关技术用于非法目的&#xff01;&#xff01;如有非法行为与本文章作者无任何关系。一切行为以遵守《中华人民共…

电力巡检三维数字化管理的新方案:图新地球电力版

电力工业是国民经济发展的重要基础能源产业&#xff0c;是世界各国经济发展战略中的优先发展重点。当前中国电力行业运行平稳&#xff0c;电力消费持续增长&#xff0c;电力装机结构延续绿色低碳发展态势&#xff0c;同时投资规模日益扩大。随着全民用电量持续快速增长&#xf…