c - 如何从 64 中获得 63 位
问题描述
我有一些由硬件填充的 32 位内存区域,其中包含此类数据:
reg1 : 63 | 62 | ... | 32 | reg0 : 31| ... | 0
-------------------------- | ----------------
val | time value upper | time value lower
我正在尝试使用struct和union一次获取时间值和“val” 。
我第一次尝试:
typedef struct
{
uint64_t time : 63;
uint64_t value : 1;
} myStruct;
但这不起作用,myStruct.time
不能大于 32 位。
我尝试了几件事,事件是这样的:
typedef union
{
union{
struct{
uint32_t lower : 32;
uint32_t upper : 31;
} spare;
uint64_t value;
} time;
struct{
uint32_t spare_low : 32;
uint32_t spare_upp : 31;
uint32_t value : 1;
} pin;
} myStruct;
但在这种情况下,myStruct.time.value
显然得到第 63 位。我得到一些值,例如 0x8000_0415_4142_3015 而不是 0x0000_0415_4142_3015。
如何轻松检索 63 位时间值和 1 位引脚值?
PS:我知道我可以制作这样的宏,我正在寻找一种直接的方法。
解决方案
改用位掩码:
uint64_t someValue = ...
uint64_t time = someValue & 0x7fffffffffffffff;
bool pin = someValue >> 63 & 1;
推荐阅读
- javascript - 使用 discord.js 中的命令禁用机器人
- javascript - 在 WordPress 中异步加载 CSS 文件
- css - 图像从网格和尺寸问题中消失
- reactjs - 由于 HTTPS 问题 MERN 无法登录 Facebook
- c - gcc 和 clang 给出不同的结果
- javascript - 在下一个 js 中为个人资料页面定义登录用户路由?
- javascript - 如何获得包含字符串和数字的数组中的平均数
- php - 如何一起使用 laravel 分页 & makeHidden 和收集方法
- python - Py2Exe:将python文件转换为可执行文件后相机不起作用
- flutter - 从 Flutter 中的另一个类访问更改的 Slider 值