如何合理使用位运算

目录

标志位

寄存器位段操作

位运算的其他应用


标志位

我们经常都会使用到标志位的操作,来标记是否去实现某个功能。比如冒泡排序中当排序没有完成,始终将一个标志位置位(flag = 1),每次循环开始又会重新清除标志位,再进行遍历。一轮循环结束,程序根据标志位是否被置位来决定是否跳出循环。

然而,在一些比较复杂的情况需要使用到多个标记时,此时使用flag1、flag2、来表示太过于繁琐,因此可以引入位运算的操作。

我们先指定一个char类型(int8_t)的数据,它是由八个字节组成,将每个字节看成一个标志位,则一个char类型的数据可以表示八个标志位,具体操作如下:

//首先我们定义一个枚举,列举出每个操作对应的位
typedef enum{mode1 = 0x01,  //0000 0001mode2 = 0x02,  //0000 0010mode3 = 0x04,  //0000 0100mode4 = 0x08,  //0000 1000mode5 = 0x10,  //0001 0000mode6 = 0x20   //0010 0000
}mode_t;int main()
{uint8_t flag = 0;  //此时没有任何标志//置位操作flag |= mode1;     //将mode1添加到flag中,此时flag的最低位置位 0000 0001flag |= mode4;     //将第4位置位,此时flag为 0000 1001//也可以这样表示://flag |= (1 << 4);  //将1左移四位再相与//判断操作if(flag &= mode1) {}  //flag最低位已经置位,与mode1相与结果为真if(flag &= mode2) {}  //flag第二位为0,与mode2相与结果为假//去除某种模式flag &= ~mode4;   //将第四位清除//也可以这样表示://flag &= ~(1 << 4);}

通过以上操作,可以轻松地通过一个数据表示出需要执行哪几种工作模式,不仅方便高效还增加了可读性。

寄存器位段操作

struct u0{unsigned int leading :3;unsigned int FLAG1: 1;unsigned int FLAG2: 1;int trailing: 27;
};//冒号后面表示这个变量占用几个比特,结构体大小为以上比特之和struct u0 uu;
uu.leading = 2; //010
uu.FLAG1 = 0;  //0
uu.FLAG2 = 1;   //1
uu.trailing = 0;
//直接通过位段操作整个寄存器//这样表示的uu是一个32比特的数
//其二进制为
//00000000 00000000 00000000 00010010
//这样可以直接通过成员名称访问某些比特,比位运算方便

位运算的其他应用

//快速交换两个变量的值:使用异或运算符(^)可以在不使用临时变量的情况下交换两个变量的值。例如,
a ^= b; 
b ^= a; 
a ^= b; //此时a、b的值已经交换//快速判断奇偶性:
if(x & 1 == 1) //x是奇数
if(x & 1 == 0) //x是偶数//快速乘除以2的幂次方:对于整数 x,x << n 可以快速将 x 乘以 2 的 n 次方;x >> n 可以快速将 x 除以 2 的 n 次方(向下取整)。x << 3 == x * 2^3x >> 2 == x / 2^2//快速判断是否为2的幂:
if(x & (x - 1) == 0) //x 是2的幂//快速求绝对值:
(x ^ (x >> 31)) - (x >> 31)//快速检查某位是否为1:if((x & (1 << n)) != 0) //检查 x 的第 n 位是否为1。//快速设置某位为1:x |= (1 << n); //将 x 的第 n 位设置为1。//快速清除某位:x &= ~(1 << n); //将 x 的第 n 位清零。//快速取模:
对于整数 x 和 2 的幂次方 y,可以使用 x & (y - 1) 来取模运算 x % y,前提是 y 是2的幂。

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

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

相关文章

基于若依的ruoyi-nbcio流程管理系统增加所有任务功能(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

如何理解光学中的群速度和相速度。

我不太明白为什么书上要区分相速度和群速度&#xff0c;不管这个&#xff0c;我想看看这两个速度在真实周期函数上的影响是如何的。 首先计算&#xff0c;直接计算三角函数我不会&#xff0c;利用复数做&#xff0c;可以取的实部。其中&#xff0c;。。 这个公式说明了什么呢…

React@16.x(34)动画(中)

目录 3&#xff0c;SwitchTransition3.1&#xff0c;原理3.1.2&#xff0c;key3.1.2&#xff0c;mode 3.2&#xff0c;举例3.3&#xff0c;结合 animate.css 4&#xff0c;TransitionGroup4.1&#xff0c;其他属性4.1.2&#xff0c;appear4.1.2&#xff0c;component4.1.3&…

Qt Quick 教程(一)

文章目录 1.Qt Quick2.QML3.Day01 案例main.qml退出按钮&#xff0c;基于上面代码添加 4.使用Qt Design StudioQt Design Studio简介Qt Design Studio工具使用版本信息 1.Qt Quick Qt Quick 是一种现代的用户界面技术&#xff0c;将声明性用户界面设计和命令性编程逻辑分开。 …

mybatis中yml配置log-impl是什么?有什么用?

在 MyBatis 中&#xff0c;log-impl 配置用于定义 MyBatis 在执行 SQL 时使用的日志实现。配置 org.apache.ibatis.logging.stdout.StdOutImpl 表示 MyBatis 会将所有的 SQL 日志直接打印到标准输出&#xff08;即控制台&#xff09;。这在开发过程中非常有用&#xff0c;因为它…

前后端完整案例-简单模仿点点开黑抽奖

数据库 后台 源码&#xff1a;https://gitee.com/qfp17393120407/game 前台 源码&#xff1a; https://gitee.com/qfp17393120407/game-weeb vue项目打包 注意&#xff1a;打包时将IP改为自己公网IP npm run build公网页面 地址&#xff1a;点点模拟抽奖 进入页面抽奖…

K8S-使用SVC域名解决ip不固定导致consul服务注册脏数据异常问题

1 概述 各个模块注册nacos时&#xff0c;采用svc域名的方式&#xff0c;各模块间feign调用时使用的svc 域名来访问&#xff0c;这样就可以和ip解耦。 否则如果使用不固定IP&#xff0c;则可能在重启的时候&#xff0c;导致consul里面有一堆脏节点数据&#xff0c;影响服务调用…

不同表格式下的小文件治理方式(开源RC file/ORC/Text非事务表、事务表、Holodesk表格式..)

友情链接&#xff1a; 小文件治理系列之为什么会出现小文件问题&#xff0c;小文件过多问题的危害以及不同阶段下的小文件治理最佳解决手段 小文件过多的解决方法&#xff08;不同阶段下的治理手段&#xff0c;SQL端、存储端以及计算端&#xff09; 概览 在前两篇博文中&am…

自学鸿蒙HarmonyOS的ArkTS语言<一>基本语法

一、一个ArkTs的目录结构 二、一个页面的结构 A、装饰器 Entry 装饰器 : 标记组件为入口组件&#xff0c;一个页面由多个自定义组件组成&#xff0c;但是只能有一个组件被标记 Component : 自定义组件, 仅能装饰struct关键字声明的数据结构 State&#xff1a;组件中的状态变量…

【JVM】触发 Full GC 的条件

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;是管理内存的关键机制。Full GC&#xff08;也称为Major GC或老年代GC&#xff09;是一种较为耗时的垃圾收集过程&#xff0c;会对整个堆&#xf…

SpirngMVC面试题

说一下 SpringMVC 支持的转发和重定向的写法(必会) 1&#xff09;转发&#xff1a; forward 方式:在返回值前面加"forward:",比如"”"forward:user.do?namemethod4" 2) 重定向: redirect 方式&#xff1a;在返回值前面加 redirect:, 比如"redi…

服务器雪崩的应对策略之----熔断机制

熔断机制&#xff08;Circuit Breaker&#xff09;是一种保护系统稳定性的重要手段。它的主要目的是防止系统在依赖的服务出现问题时&#xff0c;继续发送请求&#xff0c;从而保护系统免受进一步的影响。熔断机制通过监控请求的成功和失败率&#xff0c;在检测到故障率超过预设…

python全栈开发《10.数据类型之初识列表类型》

1.什么是列表 其实在生活中&#xff0c;有很多种排队的现象。比如看电影要排队买票&#xff0c;上地铁的时候要排队安检。在生活中&#xff0c;排队的是人&#xff0c;为了统一做一件事&#xff0c;而排成队伍&#xff0c;逐个的去等待执行这个任务&#xff0c;每个人都是执行这…

平衡查找树(数据结构篇)

数据结构之平衡查找树 平衡查找树(AVL树) 概念&#xff1a; 为了防止因为插入删除而导致的树结构不平衡(通常我们删除节点总是对右子树的最小值节点替代操作&#xff0c;而不是交替的利用左子树的最大值节点替代&#xff0c;这就将导致左子树的平均深度大于右子树平均深度&a…

基于Java的高校校园点餐系统

开头语&#xff1a; 你好&#xff0c;我是计算机专业的学长&#xff0c;如果你对高校校园点餐系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;Eclipse、Tomcat 系统展示…

分布式用例执行

前言 这两天趁着有时间&#xff0c;我疯狂的码字了~~ 背景 我们公司是做人工智能平台的&#xff0c;什么是人工智能呢&#xff1f; 大数据 机器学习。大数据运行的基本就不快。机器学习算法运行起来也是慢的让人泪流满面。在我们的集群配置下&#xff0c;我使用一个 5M 的数…

基于IDEA的Maven(properties属性配置)

&#xff08;property &#xff1a;财产&#xff09;properties&#xff1a;它的复数。 同样也是基于上篇博客进行学习。&#xff08;具体的全部项目代码和结构可以去查看上篇...&#xff09; <properties><!--当前jdk版本 , 这一步可以完全省略--><maven.com…

【技巧】Leetcode 137. 只出现一次的数字 II【中等】

只出现一次的数字 II 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a; 输入&…

2024青海三支一扶招1910人7月6日笔试

&#x1f4e2;2024年青海省三支一扶计划招募1910人公告已发布&#xff01; 小&#x1f004;️帮大家整理好了考试关键时间点&#xff1a; ★ 报名时间&#xff1a;6月20日至6月25日 ★ 报名网站&#xff1a;青海省人事考试信息网&#xff08;www.qhpta.com&#xff09; ★ 网上…

android studio构建项目报错Could not create an instance of type com.android.build.api.variant.impl.Applicat

Could not create an instance of type com.android.build.api.variant.impl.ApplicationVariantImpl 这个错误通常是由于Gradle插件版本不兼容导致的。你可能正在使用的Gradle插件版本与你的Android Studio版本不兼容。 要解决这个问题&#xff0c;你可以尝试以下解决方法&a…