LOWORD, HIWORD, LOBYTE, HIBYTE

宏函数解析:高低位数据提取
本文详细解析了LOWORD、HIWORD、LOBYTE、HIBYTE等宏函数的作用及实现原理,这些宏用于从32位或16位数据中提取高位或低位的数据。同时介绍了BYTE、WORD、DWORD等数据类型。

实际上就是宏函数,作用是取对应数据高/低位的

#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l)           ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
#define LOBYTE(w)           ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w)           ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))

LOWORD 取32bits的低16bits

HIWORD 取32bits高16bits

LOBYTE 取16bits低8bits

HIBYTE 取16bits高8bits

 

补充:

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

 

请仔细阅读和分析下面函数,保持函数原始逻辑功能不变, 不要遗漏逻辑细节,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码 要求如下: 1.保持原始函数定义不变,不要拆分函数 2.保持所有原始逻辑功能不变 3.结构体采用32位定义 4.严格保持protobuf字段映射关系,不要遗漏protobuf字段内容 5.提高执行效率,降低计算复杂度 6.已经给定的结构体名字和元素不要更改,详细的中文注释 7.自动添加中文注释说明功能逻辑 8.不使用 auto,使用显式 for 循环 特别注意: 1.函数中的 HDDMXng::BelDef::BelDef 映射为 message BelDef { optional bool optinv = 1; optional bool rbel = 2; optional string belname = 3; optional uint32 numoutputpins = 4; optional uint32 numinputpins = 5; optional uint32 numpins = 6; optional uint32 numsrcs = 7; optional uint32 numprims = 8; repeated uint32 srcgnds = 9 [packed = true]; repeated BelDefPip pips = 10; optional bool hasusagedef = 11; } 其中,依赖消息有: message BelDefPip { optional uint32 pin1 = 1; optional uint32 pin2 = 2; repeated AttrSetting attrsettings = 3; } message AttrSetting { optional string attrname = 1; optional string attrvalue = 2; } 2.将函数中 _BYTE beldef_msg[16] 映射为 HDDMXng::BelDef beldef_msg void __fastcall HDDMBelDef::addpindefs(HDDMBelDef *this, __int16 index) { HDDMBelPinDef *hddmBelPinDefArray; // rbx unsigned __int16 v3; // r12 unsigned __int64 v4; // r14 __int64 v5; // r12 HDDMBelPinDef *v6; // rax HDDMBelPinDef *v7; // rdx char v8; // cl char v9; // cl char v10; // cl char v11; // cl char v12; // cl char v13; // cl char v14; // cl char v15; // cl char v16; // cl char v17; // cl char v18; // cl char v19; // cl char v20; // cl const std::string *p_pindef_name; // rsi HDDMBelPinDef *i; // rbp hddmBelPinDefArray = this->hddmBelPinDefArray; v3 = this->beldef_code & 0x3FFF; HDDMBelDef::allocatepindefs(this, v3 + index); if ( v3 ) { v4 = 0LL; v5 = 16 * ((unsigned int)v3 - 1 + 1LL); do { v6 = &this->hddmBelPinDefArray[v4 / 0x10]; v7 = &hddmBelPinDefArray[v4 / 0x10]; v8 = hddmBelPinDefArray[v4 / 0x10].pindef_code & 1 | v6->pindef_code & 0xFE; LOBYTE(v6->pindef_code) = v8; v9 = hddmBelPinDefArray[v4 / 0x10].pindef_code & 2 | v8 & 0xFD; LOBYTE(v6->pindef_code) = v9; v10 = hddmBelPinDefArray[v4 / 0x10].pindef_code & 4 | v9 & 0xFB; LOBYTE(v6->pindef_code) = v10; v11 = hddmBelPinDefArray[v4 / 0x10].pindef_code & 8 | v10 & 0xF7; LOBYTE(v6->pindef_code) = v11; v12 = hddmBelPinDefArray[v4 / 0x10].pindef_code & 0x10 | v11 & 0xEF; LOBYTE(v6->pindef_code) = v12; LOBYTE(v6->pindef_code) = hddmBelPinDefArray[v4 / 0x10].pindef_code & 0x20 | v12 & 0xDF; v6->pindef_code = hddmBelPinDefArray[v4 / 0x10].pindef_code & 0xFFFC0 | v6->pindef_code & 0xFFF0003F; BYTE2(v6->pindef_code) = BYTE2(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 0xF0 | BYTE2(v6->pindef_code) & 0xF; v13 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 1 | HIBYTE(v6->pindef_code) & 0xFE; HIBYTE(v6->pindef_code) = v13; v14 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 2 | v13 & 0xFD; HIBYTE(v6->pindef_code) = v14; v15 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 4 | v14 & 0xFB; HIBYTE(v6->pindef_code) = v15; v16 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 8 | v15 & 0xF7; HIBYTE(v6->pindef_code) = v16; v17 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 0x10 | v16 & 0xEF; HIBYTE(v6->pindef_code) = v17; v18 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 0x20 | v17 & 0xDF; HIBYTE(v6->pindef_code) = v18; v19 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 0x40 | v18 & 0xBF; HIBYTE(v6->pindef_code) = v19; HIBYTE(v6->pindef_code) = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) & 0x80 | v19 & 0x7F; LOBYTE(v6->pindef_code1) = hddmBelPinDefArray[v4 / 0x10].pindef_code1 & 0xF | v6->pindef_code1 & 0xF0; LOWORD(v6->pindef_code1) = hddmBelPinDefArray[v4 / 0x10].pindef_code1 & 0xFFF0 | v6->pindef_code1 & 0xF; HIWORD(v6->pindef_code1) = HIWORD(hddmBelPinDefArray[v4 / 0x10].pindef_code1) & 0x3FF | HIWORD(v6->pindef_code1) & 0xFC00; v20 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code1) & 0x3C | HIBYTE(v6->pindef_code1) & 0xC3; p_pindef_name = (const std::string *)&hddmBelPinDefArray[v4 / 0x10].pindef_name; v4 += 16LL; HIBYTE(v6->pindef_code1) = v20; HIBYTE(v6->pindef_code1) = HIBYTE(v7->pindef_code1) & 0xC0 | v20 & 0x3F; std::string::assign((std::string *)&v6->pindef_name, p_pindef_name); } while ( v4 != v5 ); } if ( hddmBelPinDefArray ) { for ( i = &hddmBelPinDefArray[hddmBelPinDefArray[-1].pindef_name]; hddmBelPinDefArray != i; HDDMBelPinDef::~HDDMBelPinDef(i) ) { --i; } operator delete[](&hddmBelPinDefArray[-1].pindef_name); } }
最新发布
10-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值