使用位掩码和指针从 int 中保存一个字节

Posted

技术标签:

【中文标题】使用位掩码和指针从 int 中保存一个字节【英文标题】:Save a byte from int with bit mask and pointers 【发布时间】:2021-02-01 07:15:59 【问题描述】:

如何保存 int 值的第二个字节?比如说,我们有int achar c

    通过指针,我们可以得到变量a 的地址,就像char* pC = (char*)&a; 一样,要从 int 中获取第二个字节并保存到 char 中,下一步该怎么做? 使用面具应该是这样的((a << 8) >> 24)。但为什么会这样?接下来要怎么做才能保存第二个字节?

非常感谢。

【问题讨论】:

你能分享完整的代码吗?我想我遇到了你的“问题”,但我不完全确定你为什么要问 第二位的值为2。所以用2 屏蔽以查看是否设置了第二位。如果你想在一个条件下使用它,记住所有非零都是“真”。 还记得endianness。如果您有一个指向一系列字节的指针,则“第二位”可能位于不同的位置。 @RoQuOTriX 基本上这是一个完整的任务。我分享了我正在考虑的代码。 任务当然完成了。但是你只提供了两个陈述,说某物是面具,然后问为什么?我可以给你一个你想要的代码。但我认为这不会帮助你理解“幕后”发生的事情。因此,我们希望帮助您逐步了解自己在做什么 【参考方案1】:

您可以进行基本的位屏蔽。说,a = 0x12 34 56 78。如果您将AND a0x00 00 FF 00,您将有0x00 00 56 00 剩余。然后您可以移动您的位 8 次以获得0x00 00 00 56。你甚至不需要指针。

让我们以二进制形式显示它以更好地说明:

00010010 00110100 01010110 01111000 (a in binary)
00000000 00000000 11111111 00000000 (bitmask)
00000000 00000000 01010110 00000000 (AND result)
00000000 00000000 00000000 01010110 (>> 8 result)

代码是:

#include <stdio.h>

int main()

    int a = 0x12345678;
    int result = (a & 0x0000FF00) >> 8;

    printf("a : 0x%x , result : 0x%x\n", a, result);

    return 0;

输出a : 0x12345678 , result : 0x56,这是原始整数的第二个字节。同样,您可以使用基本的按位运算获得整数的任何部分。

【讨论】:

非常感谢您。但是如果回到最初的问题,如何使用指针来做到这一点?如果我这样做 ((a > 24) 这背后的逻辑是什么?我们向左移动 8 位以获得内存块的第一个单元格,然后我们需要用 >> 24 将其他单元格填满零。为什么是 24? int a = 0x12345678;, char *pc = ((char *) &amp;a) + 1; 指向倒数第二个字节。关于这个技巧,8 位是 1 个字节,24 位是 3 个字节。如果我们将int b = a &lt;&lt; 8; b 变为0x34 56 78 00,我们只需重置第二个字节之前的字节。然后我们做int b = (a&lt;&lt;8)&gt;&gt;24;,b 变成了0x00 00 00 34,它只包含第二个字节。第一个操作帮助我们摆脱了34 之前的字节和&gt;&gt;24 摆脱了34 之后的字节,并将我们想要的字节倾斜到数字的右侧。 没问题,介意选择这个答案作为解决方案并投票吗?

以上是关于使用位掩码和指针从 int 中保存一个字节的主要内容,如果未能解决你的问题,请参考以下文章

位掩码和 Air724 LTE 模块

如何从 __m64 值的 lsb 创建一个 8 位掩码?

根据位掩码拆分多个字节

Three.js中使用MarkPass(掩码)的高级效果组合器

使用 SQLite 进行位掩码分组

递归函数,使用位掩码c ++显示集合的所有子集