当前位置: 首页 > 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…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...