常用的bit位操作
//判断某1位是1还是0
#ifndef GET_BIT
#define BIT_IS_1(value,bitpos) (((value)&(1<<(bitpos)))>>(bitpos))
#endif//读取指定位置bit位的值
#ifndef GET_BIT
#define GET_BIT(value,bitpos) ((value)&(1<<(bitpos)))
#endif//取反指定位置bit位的值
#ifndef REV_BIT
#define REV_BIT(value,bitpos) ((value)^=(1<<(bitpos)))
#endif//把某个bit位置0
#ifndef SET_0_BIT
#define SET_0_BIT(value,bitpos) ((value)&=~(1<<(bitpos)))
#endif//把某个bit位置1
#ifndef SET_1_BIT
#define SET_1_BIT(value,bitpos) ((value)|= (1<<(bitpos)))
#endif//将两个unsigned char 转换成 unsigned short(BYTExBYTE2WORD)
#ifndef MAKE_WORD
#define MAKE_WORD(low, high) ((unsigned short)(((unsigned char)(((unsigned __int64)(low)) & 0xff)) | ((unsigned short)((unsigned char)(((unsigned __int64)(high)) & 0xff))) << 8))
#endif//将两个unsigned short转换成 long(WORDxWORD2DWORD)
#ifndef MAKE_LONG
#define MAKE_LONG(low, high) ((long)(((unsigned short)(((unsigned __int64)(low)) & 0xffff)) | ((unsigned long)((unsigned short)(((unsigned __int64)(high)) & 0xffff))) << 16))
#endif
//取一个数的其中几位,例如:x的bit[7,4]:表示状态,则取值计算为 auto val=GET_4LO2HI(x,4,7);
#ifndef GET_4LO2HI
#ifdef __cplusplus
#define GET_4LO2HI(value,from,to) GetRangValue(value,from,to)
template<typename Type>
inline Type GetRangValue(Type vaule,int from,int to)
{
Type ret=0;
int temp = ((sizeof(Type)*8)-1)-to;
ret = (Type)(vaule<<temp);
ret =ret>>(temp+from);
return ret;
}
#else
/*
*在c语言中不能进行类型推导,故定义了如下几个宏
*/
#define GET_4LO2HI_USHORT(value,low,high) (((unsigned short)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_UCHAE(value,low,high) (((unsigned char)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_UINT(value,low,high) (((unsigned int)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_ULONG(value,low,high) (((unsigned long)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_U_INT64(value,low,high) (((unsigned __int64)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_SHORT(value,low,high) (((signed short)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_CHAE(value,low,high) (((signed char)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_INT(value,low,high) (((signed int)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_LONG(value,low,high) (((signed long)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI__INT64(value,low,high) (((signed __int64)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#endif
#endif
/*如
* 偏移地址 说明
*0x00 bit[7:0],对应 id 高 8 位
* bit[15:8],帧类型,
* 0x04,命令帧;
* 0x01,数据帧;
* 0x05,状态帧;
*0x01 bit[15:0],对应 id 低 16 位
* char _0x00addrValue=0xaa;
* char _0x01addrValue=0x55;
* auto id = MAKE_LONG_BIT(_0x01addrValue,0,15,_0x00addrValue,0,7);
*/
#ifndef MAKE_LONG_BIT
#define MAKE_LONG_BIT(low,lowfrom,lowto,high,highfrom,highto) MAKE_LONG(GET_4LO2HI(low,lowfrom,lowto),GET_4LO2HI(high,highfrom,highto))
#endif//取DWORD的低位WORD
#ifndef LO_WORD
#define LO_WORD(l) ((unsigned short)(((unsigned __int64)(l)) & 0xffff))
#endif//取DWORD的高位WORD
#ifndef HI_WORD
#define HI_WORD(l) ((unsigned short)((((unsigned __int64)(l)) >> 16) & 0xffff))
#endif//取WORD的低位BYTE
#ifndef LO_BYTE
#define LO_BYTE(w) ((unsigned char)(((unsigned __int64)(w)) & 0xff))
#endif//取WORD的高位BYTE
#ifndef HI_BYTE
#define HI_BYTE(w) ((unsigned char)((((unsigned __int64)(w)) >> 8) & 0xff))
#endif
//判断某1位是1还是0
#ifndef GET_BIT
#define BIT_IS_1(value,bitpos) (((value)&(1<<(bitpos)))>>(bitpos))
#endif//读取指定位置bit位的值
#ifndef GET_BIT
#define GET_BIT(value,bitpos) ((value)&(1<<(bitpos)))
#endif//取反指定位置bit位的值
#ifndef REV_BIT
#define REV_BIT(value,bitpos) ((value)^=(1<<(bitpos)))
#endif//把某个bit位置0
#ifndef SET_0_BIT
#define SET_0_BIT(value,bitpos) ((value)&=~(1<<(bitpos)))
#endif//把某个bit位置1
#ifndef SET_1_BIT
#define SET_1_BIT(value,bitpos) ((value)|= (1<<(bitpos)))
#endif//将两个unsigned char 转换成 unsigned short(BYTExBYTE2WORD)
#ifndef MAKE_WORD
#define MAKE_WORD(low, high) ((unsigned short)(((unsigned char)(((unsigned __int64)(low)) & 0xff)) | ((unsigned short)((unsigned char)(((unsigned __int64)(high)) & 0xff))) << 8))
#endif//将两个unsigned short转换成 long(WORDxWORD2DWORD)
#ifndef MAKE_LONG
#define MAKE_LONG(low, high) ((long)(((unsigned short)(((unsigned __int64)(low)) & 0xffff)) | ((unsigned long)((unsigned short)(((unsigned __int64)(high)) & 0xffff))) << 16))
#endif
//取一个数的其中几位,例如:x的bit[7,4]:表示状态,则取值计算为 auto val=GET_4LO2HI(x,4,7);
#ifndef GET_4LO2HI
#ifdef __cplusplus
#define GET_4LO2HI(value,from,to) GetRangValue(value,from,to)
template<typename Type>
inline Type GetRangValue(Type vaule,int from,int to)
{Type ret=0;int temp = ((sizeof(Type)*8)-1)-to;ret = (Type)(vaule<<temp);ret =ret>>(temp+from);return ret;
}
#else
/*
*在c语言中不能进行类型推导,故定义了如下几个宏
*/
#define GET_4LO2HI_USHORT(value,low,high) (((unsigned short)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_UCHAE(value,low,high) (((unsigned char)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_UINT(value,low,high) (((unsigned int)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_ULONG(value,low,high) (((unsigned long)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_U_INT64(value,low,high) (((unsigned __int64)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_SHORT(value,low,high) (((signed short)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_CHAE(value,low,high) (((signed char)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_INT(value,low,high) (((signed int)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI_LONG(value,low,high) (((signed long)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#define GET_4LO2HI__INT64(value,low,high) (((signed __int64)(value<<(((sizeof(value)*8)-1)-high)))>>((((sizeof(value)*8)-1)-high)+low))
#endif
#endif
/*如* 偏移地址 说明*0x00 bit[7:0],对应 id 高 8 位* bit[15:8],帧类型,* 0x04,命令帧;* 0x01,数据帧;* 0x05,状态帧;*0x01 bit[15:0],对应 id 低 16 位* char _0x00addrValue=0xaa;* char _0x01addrValue=0x55;* auto id = MAKE_LONG_BIT(_0x01addrValue,0,15,_0x00addrValue,0,7);
*/
#ifndef MAKE_LONG_BIT
#define MAKE_LONG_BIT(low,lowfrom,lowto,high,highfrom,highto) MAKE_LONG(GET_4LO2HI(low,lowfrom,lowto),GET_4LO2HI(high,highfrom,highto))
#endif//取DWORD的低位WORD
#ifndef LO_WORD
#define LO_WORD(l) ((unsigned short)(((unsigned __int64)(l)) & 0xffff))
#endif//取DWORD的高位WORD
#ifndef HI_WORD
#define HI_WORD(l) ((unsigned short)((((unsigned __int64)(l)) >> 16) & 0xffff))
#endif//取WORD的低位BYTE
#ifndef LO_BYTE
#define LO_BYTE(w) ((unsigned char)(((unsigned __int64)(w)) & 0xff))
#endif//取WORD的高位BYTE
#ifndef HI_BYTE
#define HI_BYTE(w) ((unsigned char)((((unsigned __int64)(w)) >> 8) & 0xff))
#endif
相关文章:
常用的bit位操作
//判断某1位是1还是0 #ifndef GET_BIT #define BIT_IS_1(value,bitpos) (((value)&(1<<(bitpos)))>>(bitpos)) #endif //读取指定位置bit位的值 #ifndef GET_BIT #define GET_BIT(value,bitpos) ((value)&(1<<(bitpos))) #endif //取反指定位置bit位…...

自动控制原理【期末复习】(二)
无人机上桨之后可以在调试架上先调试: 1.根轨迹的绘制 /// 前面针对的是时域分析,下面针对频域分析: 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度...

机器学习——集成学习和梯度提升决策树
集成学习 不同的算法都可以对解决同一个问题,但是可能准确率不同,集成学习就是不同算法按照某种组合来解决问题,使得准确率提升。 那怎么组合算法呢? 自举聚合算法**(bagging)** 顾名思义是 自举聚合 自举…...

MYSQL 查看SQL执行计划
一、explain explain select id,db,user,host,command,time,state,info from information_schema.processlist order by time desc; id: 查询的标记,可以查看不同查询的执行顺序。 select_type: 查询的类型,如SIMPLE、SUBQUERY、PRIMARY等。 table: …...
ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的MPAM
安全之安全(security)博客目录导读 关于RME的MPAM变化的完整定义见在《Arm Architecture Reference Manual Supplement, Memory System Resource Partitioning and Monitoring (MPAM), for A-profile architecture》中详细说明。 实现RME的处理元件(PE)能够生成一个2位的MPAM_…...
cuda 架构设置
import torch torch.cuda.get_device_capability(0) 添加cmake options: -DCMAKE_CUDA_ARCHITECTURES86 -DCMAKE_CUDA_COMPILER/usr/local/cuda-11.8/bin/nvcc cmake工程出现“CMAKE_CUDA_ARCHITECTURES must be non-empty if set.“的解决方法_failed to detec…...
基于 Vue 3 封装一个 ECharts 图表组件
在前端开发中,数据可视化是展示数据的重要方式之一。ECharts 是一个强大的开源可视化库,能够帮助我们轻松地创建各种图表。本文将介绍如何在 Vue 3 项目中使用 ECharts 封装一个图表组件。 代码 <template><div ref"chartRef" styl…...

LeetCode 算法: 旋转图像c++
原题链接🔗: 旋转图像 难度:中等⭐️⭐️ 题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图…...
Java Android 静态内部类 以及优雅实现单例模式/避免handler内存泄漏
前言 Java 中的静态内部类(Static Nested Class)是定义在另一个类里面的一个静态类。它和普通的内部类有些区别,主要是静态内部类不需要依赖于外部类的实例就可以被创建和访问。这种类的特性使得它非常适合用来作为辅助类,用于支持外部类的功能。 特点以及使用场景 静态内…...
Flink协调器Coordinator及自定义Operator
Flink协调器Coordinator及自定义Operator 最近的项目开发过程中,使用到了Flink中的协调器以及自定义算子相关的内容,本篇文章主要介绍Flink中的协调器是什么,如何用,以及协调器与算子间的交互。 协调器Coordinator Flink中的协调…...
C调用C++中的类
文章目录 测试代码 测试代码 在C语言中调用C类,需要遵循几个步骤: 在C代码中,确保C类的函数是extern “C”,这样可以防止名称修饰(name mangling)。 使用头文件声明C类的公共接口,并且为这个…...

NFTScan 正式上线 Sei NFTScan 浏览器和 NFT API 数据服务
2024 年 6 月 12 号,NFTScan 团队正式对外发布了 Sei NFTScan 浏览器,将为 Sei 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,Sei 是继 Bitcoin、Ethereum、BNBChain、Polyg…...
2024年高考:计算机相关专业前景分析与选择建议
2024年高考结束,面对计算机专业是否仍具有吸引力的讨论,本文将从行业趋势、就业市场、个人兴趣与能力、专业选择建议等多个角度进行深入分析,以帮助考生和家长做出明智的决策。 文章目录 一、行业趋势与就业市场1. 计算机行业的发展与变革2. …...

SQL聚合函数---汇总数据
此篇文章内容均来自与mysql必知必会教材,后期有衍生会继续更新、补充知识体系结构 文章目录 SQL聚集函数表:AGV()count()根据需求可以进行组合处理 max()min()max()、min()、avg()组…...
webpack5新特性
webpack5新特性 持久化缓存资源模块moduleIds & chunkIds的优化更智能的tree shakingnodeJs的polyfill脚本被移除支持生成e6/es2015的代码SplitChunk和模块大小Module Federation 持久化缓存 缓存生成的webpack模块和chunk,来改善构建速度cache 会在开发模式被设置成 ty…...
java单体服务自定义锁名称工具类
需求: 操作员能够对自己权限下的用户数据进行数据填充,但是不同操作员之间可能会有重复的用户数据,为了避免操作员覆盖数据或者重复操作数据,应该在操作用户数据时加锁,要求加的这一把锁必须是细粒度的锁,…...
整理好了!2024年最常见 20 道并发编程面试题(四)
上一篇地址:整理好了!2024年最常见 20 道并发编程面试题(三)-CSDN博客 七、请解释什么是条件变量(Condition Variable)以及它的用途。 条件变量是一种同步机制,用于在多线程编程中协调线程间的…...
持续交付一
一、 你的项目依赖的 jQuery 版本是 1.0.0 ,Bootstrap 依赖的版本是 1.1.0,而 Chosen 依赖的版本是 1.2.0,看上去都是小版本不一致,一开始并没有发现任何问题,但是如果到后期发现不兼容,可能就为时已晚了。…...

基于 Python 解析 XML 文件并将数据存储到 MongoDB 数据库
1. 问题背景 在软件开发中,我们经常需要处理各种格式的数据。XML 是一种常用的数据交换格式,它可以存储和传输结构化数据。很多网站会提供 XML 格式的数据接口,以便其他系统可以方便地获取数据。 我们有这样一个需求:我们需要从…...
Interview preparation--案例加密后数据的模糊查询
加密数据的模糊查询实现方案 我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有࿱…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...