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

这篇具有很好参考价值的文章主要介绍了第7天----【位运算进阶之----位或(|)】七夕特别版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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



一、昨日重现:

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

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

2的幂 十进制表达 二进制表达
2^0 1 0001
2^1 2 0010
2^2 4 0100
2^3 8 1000

✨我们简单地列举出几个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。

三、拓展应用:

第7天----【位运算进阶之----位或(|)】七夕特别版,重生之我的C语言崛起之路----每日一题,c++,算法,c语言

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)
第7天----【位运算进阶之----位或(|)】七夕特别版,重生之我的C语言崛起之路----每日一题,c++,算法,c语言文章来源地址https://www.toymoban.com/news/detail-666610.html

到了这里,关于第7天----【位运算进阶之----位或(|)】七夕特别版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 重生之我是孔乙己——查找数组缺失元素的几种方法

      💌 博客内容:查找缺失元素 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘 目录 题目  排序法  异或法  最天

    2023年04月10日
    浏览(29)
  • 七夕特别篇 | 浪漫的Bug

    Hello!各位C站的朋友们大家好啊!在长达 七个月 的停更后,小刘又回来了! 在这里,小刘要郑重地向大家道个歉,因为学业繁重,所以小刘没能挤出时间来写博客,让朋友们久等了! 如今,正值七夕佳节(好像过了,但不重要),小刘写了点儿有意思的东西请大家阅览,如

    2024年02月10日
    浏览(27)
  • 七夕特别篇|用Python绘画牛郎织女在鹊桥相见

    大家好,我是辰哥~ 明天就是七夕节,首先提前祝福有伴侣的小伙伴,七夕快乐,没有伴侣的小伙伴,明天就会找到伴侣,(给看到这句话的你好运加持,哈哈哈)。 作为会Python的我们必须做点好玩且有意义的东西。在本文中辰哥使用turtle库进行绘制,如果不清楚turtle的大概

    2023年04月08日
    浏览(36)
  • 【AI绘画--七夕篇】:七夕特别教程,使用SDXL绘制你的心上人(Stable Diffusion)(封神榜—妲己)

    七夕特别教程,快来使用SDXL画出一个女朋友吧! Stable Diffusion是一种基于潜在扩散模型(Latent Diffusion Models,简称LDM)的模型,它最近在各个平台上都引起了广泛的关注,因为其在文本到图像(text2img)或图像到图像(img2img)的应用中都展示出了非常惊艳的效果。 Stable Diffu

    2024年02月11日
    浏览(40)
  • 业余电子试验的用电安全之我的建议

    常在电边摸,哪有不被电的。 这说明了经常接触电的试验,一不小心,有很大的概率触电。所以做好实验的安全准备是头等大事。 写这个是因为在群里面讨论时,遇到很多人做电的试验是“英勇无畏”,什么都是不讲原则的乱捅,有人称为怼。 我很小时,做了一个用盐水导

    2024年04月16日
    浏览(16)
  • opencv -12 图像运算之按 《位或》 运算(图像融合&图像修复和去除)

    或运算的规则是,当参与或运算的两个逻辑值中有一个为真时,结果就为真。其逻辑关系可以类比为如图 所示的并联电路,两个开关中只要有任意一个闭合时,灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明,表中使用“or”表示或运算。 按位或运算是指将数值转

    2024年02月16日
    浏览(46)
  • 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    目录 位运算 按位与运算符 [ ] 按位或运算符 [ | ] 异或运算符 [ ^ ] 取反运算符 [ ~ ] 移位操作 一些面试常考的位操作运算 获取二进制中最右边的1 计算机原码、反码、补码 机器数 “三码”之间的转换 计算机中为啥要用补码呢? 真数 原码 反码 补码 有了原码为什么要使用反码

    2024年02月02日
    浏览(36)
  • 存在对其他服务器端口(TCP:8090)的攻击行为之我的服务器被黑了

    一觉睡醒,微信邮箱凌晨发邮件过来,提示我的服务器在攻击别人。此时我的反应:不可能,绝对不可能!不是我没有那个胆子(狗头),是我真没有那个技术。上图,如下: 可以明显看到,就趁我睡觉的时候干坏事。 提前申明,我单纯是搞软件开发的,Linux运维知识还有网

    2024年02月11日
    浏览(43)
  • 位运算:按位与、按位或、按位异或、按位左移、按位右移

    目录 一、基础知识补充     (1)位运算     (2)二进制的详细操作 二、位运算     (1)按位与()     (2)按位或(|)     (3)按位异或(^)       (4)按位左移()     (5)按位右移() 三、位运算例题     题目描述:     题解: 四、共勉     位运算符要比一般

    2024年02月03日
    浏览(35)
  • 【我的OpenGL学习进阶之旅】Assimp库支持哪些3D模型格式?

    在通过LearnOpenGL学习 OpenGL 知识的时候,有介绍如何通过Assimp来加载3D模型,并了解了Mesh网格的概念。 Assimp Mesh网格 3D模型 在 https://learnopengl-cn.github.io/03%20Model%20Loading/01%20Assimp/ 中有介绍使用 Assimp 库来加载 3D 模型 .obj 格式。 一个非常流行的模型导入库是Assimp,它是 Open Asse

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包