当前位置: 首页 > news >正文

常用的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位…...

自动控制原理【期末复习】(二)

无人机上桨之后可以在调试架上先调试&#xff1a; 1.根轨迹的绘制 /// 前面针对的是时域分析&#xff0c;下面针对频域分析&#xff1a; 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度...

机器学习——集成学习和梯度提升决策树

集成学习 不同的算法都可以对解决同一个问题&#xff0c;但是可能准确率不同&#xff0c;集成学习就是不同算法按照某种组合来解决问题&#xff0c;使得准确率提升。 那怎么组合算法呢&#xff1f; 自举聚合算法**&#xff08;bagging&#xff09;** 顾名思义是 自举聚合 自举…...

MYSQL 查看SQL执行计划

一、explain explain select id,db,user,host,command,time,state,info from information_schema.processlist order by time desc; id: 查询的标记&#xff0c;可以查看不同查询的执行顺序。 select_type: 查询的类型&#xff0c;如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&#xff1a; -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 图表组件

在前端开发中&#xff0c;数据可视化是展示数据的重要方式之一。ECharts 是一个强大的开源可视化库&#xff0c;能够帮助我们轻松地创建各种图表。本文将介绍如何在 Vue 3 项目中使用 ECharts 封装一个图表组件。 代码 <template><div ref"chartRef" styl…...

LeetCode 算法: 旋转图像c++

原题链接&#x1f517;&#xff1a; 旋转图像 难度&#xff1a;中等⭐️⭐️ 题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图…...

Java Android 静态内部类 以及优雅实现单例模式/避免handler内存泄漏

前言 Java 中的静态内部类(Static Nested Class)是定义在另一个类里面的一个静态类。它和普通的内部类有些区别,主要是静态内部类不需要依赖于外部类的实例就可以被创建和访问。这种类的特性使得它非常适合用来作为辅助类,用于支持外部类的功能。 特点以及使用场景 静态内…...

Flink协调器Coordinator及自定义Operator

Flink协调器Coordinator及自定义Operator 最近的项目开发过程中&#xff0c;使用到了Flink中的协调器以及自定义算子相关的内容&#xff0c;本篇文章主要介绍Flink中的协调器是什么&#xff0c;如何用&#xff0c;以及协调器与算子间的交互。 协调器Coordinator Flink中的协调…...

C调用C++中的类

文章目录 测试代码 测试代码 在C语言中调用C类&#xff0c;需要遵循几个步骤&#xff1a; 在C代码中&#xff0c;确保C类的函数是extern “C”&#xff0c;这样可以防止名称修饰&#xff08;name mangling&#xff09;。 使用头文件声明C类的公共接口&#xff0c;并且为这个…...

NFTScan 正式上线 Sei NFTScan 浏览器和 NFT API 数据服务

2024 年 6 月 12 号&#xff0c;NFTScan 团队正式对外发布了 Sei NFTScan 浏览器&#xff0c;将为 Sei 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Sei 是继 Bitcoin、Ethereum、BNBChain、Polyg…...

2024年高考:计算机相关专业前景分析与选择建议

2024年高考结束&#xff0c;面对计算机专业是否仍具有吸引力的讨论&#xff0c;本文将从行业趋势、就业市场、个人兴趣与能力、专业选择建议等多个角度进行深入分析&#xff0c;以帮助考生和家长做出明智的决策。 文章目录 一、行业趋势与就业市场1. 计算机行业的发展与变革2. …...

SQL聚合函数---汇总数据

此篇文章内容均来自与mysql必知必会教材&#xff0c;后期有衍生会继续更新、补充知识体系结构 文章目录 SQL聚集函数表&#xff1a;AGV()count()根据需求可以进行组合处理 max()min()max&#xff08;&#xff09;、min&#xff08;&#xff09;、avg&#xff08;&#xff09;组…...

webpack5新特性

webpack5新特性 持久化缓存资源模块moduleIds & chunkIds的优化更智能的tree shakingnodeJs的polyfill脚本被移除支持生成e6/es2015的代码SplitChunk和模块大小Module Federation 持久化缓存 缓存生成的webpack模块和chunk,来改善构建速度cache 会在开发模式被设置成 ty…...

java单体服务自定义锁名称工具类

需求&#xff1a; 操作员能够对自己权限下的用户数据进行数据填充&#xff0c;但是不同操作员之间可能会有重复的用户数据&#xff0c;为了避免操作员覆盖数据或者重复操作数据&#xff0c;应该在操作用户数据时加锁&#xff0c;要求加的这一把锁必须是细粒度的锁&#xff0c;…...

整理好了!2024年最常见 20 道并发编程面试题(四)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道并发编程面试题&#xff08;三&#xff09;-CSDN博客 七、请解释什么是条件变量&#xff08;Condition Variable&#xff09;以及它的用途。 条件变量是一种同步机制&#xff0c;用于在多线程编程中协调线程间的…...

持续交付一

一、 你的项目依赖的 jQuery 版本是 1.0.0 &#xff0c;Bootstrap 依赖的版本是 1.1.0&#xff0c;而 Chosen 依赖的版本是 1.2.0&#xff0c;看上去都是小版本不一致&#xff0c;一开始并没有发现任何问题&#xff0c;但是如果到后期发现不兼容&#xff0c;可能就为时已晚了。…...

基于 Python 解析 XML 文件并将数据存储到 MongoDB 数据库

1. 问题背景 在软件开发中&#xff0c;我们经常需要处理各种格式的数据。XML 是一种常用的数据交换格式&#xff0c;它可以存储和传输结构化数据。很多网站会提供 XML 格式的数据接口&#xff0c;以便其他系统可以方便地获取数据。 我们有这样一个需求&#xff1a;我们需要从…...

Interview preparation--案例加密后数据的模糊查询

加密数据的模糊查询实现方案 我们知道加密后的数据对模糊查询不是很友好&#xff0c;本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路&#xff0c;希望对大家有所启发。为了数据安全我们在开发过程中经常会对重要的数据进行加密存储&#xff0c;常见的有&#xff1…...

Maccy剪贴板管理器:彻底改变你的macOS复制粘贴体验

Maccy剪贴板管理器&#xff1a;彻底改变你的macOS复制粘贴体验 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy Maccy是一款专为macOS设计的轻量级剪贴板管理器&#xff0c;它彻底改变了你的复制粘…...

小型电商自动化:OpenClaw+nanobot处理订单邮件

小型电商自动化&#xff1a;OpenClawnanobot处理订单邮件 1. 为什么选择OpenClaw处理电商订单 作为一个经营小型电商的个体商户&#xff0c;我每天要处理几十封来自Gmail的订单邮件。这些邮件包含客户信息、商品清单和收货地址&#xff0c;需要手动录入到库存表格、生成物流单…...

CloudScraper 配置优化:如何提升采集效率与稳定性

在合规采集场景中&#xff0c;不少用户在使用CloudScraper时&#xff0c;频繁出现请求卡顿、采集中断等问题。 本篇文章&#xff0c;LokiProxy将为您系统梳理影响CloudScraper运行效率的关键环节&#xff0c;并结合实际场景提出可行的优化思路&#xff0c;助力用户在合规框架内…...

TranslucentTB启动失败解决方案:3种方法修复Microsoft.UI.Xaml.2.8缺失问题

TranslucentTB启动失败解决方案&#xff1a;3种方法修复Microsoft.UI.Xaml.2.8缺失问题 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB T…...

OpenCore Configurator:革新性黑苹果配置工具,让复杂引导设置化繁为简

OpenCore Configurator&#xff1a;革新性黑苹果配置工具&#xff0c;让复杂引导设置化繁为简 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 价值定位&#…...

Nano Banana API 来了:不到半价享官方同款品质,仅需约 ¥0.10/张!

最近被谷歌新发布的 Nano Banana&#xff08;Gemini 2.5 Flash Image&#xff09;图像生成模型 霸屏了。 从手办秒变真人级 Cosplay&#xff0c;到一键统一多图风格&#xff0c;从个性化头像到产品概念设计&#xff0c;甚至连静态画作都能一键生成电影级动态分镜——这波 AI 生…...

asp毕业设计下载(全套源码+配套论文)——基于asp+access的办公系统设计与实现

基于aspaccess的办公系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspaccess的办公系统设计与实现&#xff0c;更多精选毕业设计项目实例见文末哦。 文章目录&#xff1a; 基于aspaccess的办公系统设计与实现&#xff08;毕…...

如何将TaskWeaver与LangChain无缝集成:扩展AI代理能力边界的终极指南

如何将TaskWeaver与LangChain无缝集成&#xff1a;扩展AI代理能力边界的终极指南 【免费下载链接】TaskWeaver A code-first agent framework for seamlessly planning and executing data analytics tasks. 项目地址: https://gitcode.com/gh_mirrors/ta/TaskWeaver T…...

如何轻松实现专业音频低延迟:FlexASIO实用配置完全指南

如何轻松实现专业音频低延迟&#xff1a;FlexASIO实用配置完全指南 【免费下载链接】FlexASIO A flexible universal ASIO driver that uses the PortAudio sound I/O library. Supports WASAPI (shared and exclusive), KS, DirectSound and MME. 项目地址: https://gitcode…...

软考-信息系统项目管理师-项目风险管理-知识点及考点预测

本章考情分析&#xff1a;项目风险管理是十大知识领域中“理论工具计算”结合最紧密的章节之一。历年综合知识选择题约占3-5分&#xff0c;案例分析几乎必考1道题&#xff08;10-20分&#xff09;&#xff0c;论文也是高频方向。“风险是未来的不确定性&#xff0c;问题已经是过…...