使用位掩码和指针从 int 中保存一个字节
Posted
技术标签:
【中文标题】使用位掩码和指针从 int 中保存一个字节【英文标题】:Save a byte from int with bit mask and pointers 【发布时间】:2021-02-01 07:15:59 【问题描述】:如何保存 int 值的第二个字节?比如说,我们有int a
和char c
。
-
通过指针,我们可以得到变量
a
的地址,就像char* pC = (char*)&a;
一样,要从 int 中获取第二个字节并保存到 char 中,下一步该怎么做?
使用面具应该是这样的((a << 8) >> 24)
。但为什么会这样?接下来要怎么做才能保存第二个字节?
非常感谢。
【问题讨论】:
你能分享完整的代码吗?我想我遇到了你的“问题”,但我不完全确定你为什么要问 第二位的值为2
。所以用2
屏蔽以查看是否设置了第二位。如果你想在一个条件下使用它,记住所有非零都是“真”。
还记得endianness。如果您有一个指向一系列字节的指针,则“第二位”可能位于不同的位置。
@RoQuOTriX 基本上这是一个完整的任务。我分享了我正在考虑的代码。
任务当然完成了。但是你只提供了两个陈述,说某物是面具,然后问为什么?我可以给你一个你想要的代码。但我认为这不会帮助你理解“幕后”发生的事情。因此,我们希望帮助您逐步了解自己在做什么
【参考方案1】:
您可以进行基本的位屏蔽。说,a = 0x12 34 56 78
。如果您将AND
a
和0x00 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 *) &a) + 1;
指向倒数第二个字节。关于这个技巧,8 位是 1 个字节,24 位是 3 个字节。如果我们将int b = a << 8;
b 变为0x34 56 78 00
,我们只需重置第二个字节之前的字节。然后我们做int b = (a<<8)>>24;
,b 变成了0x00 00 00 34
,它只包含第二个字节。第一个操作帮助我们摆脱了34
之前的字节和>>24
摆脱了34
之后的字节,并将我们想要的字节倾斜到数字的右侧。
没问题,介意选择这个答案作为解决方案并投票吗?以上是关于使用位掩码和指针从 int 中保存一个字节的主要内容,如果未能解决你的问题,请参考以下文章