MFC 如何生成一个32位字节的16进制数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 如何生成一个32位字节的16进制数相关的知识,希望对你有一定的参考价值。
首先要明白,在机器内部,任何数据都是二进制存储的,别的进制都是显示问题32位也就是4字节,int类型就是4字节
int x=0x89abcdef; //就是一个16进制的数 0x 是16进制的标志
int y=2309737967; //此行定义的是一个十进制的数据 但是 x与y是相等的
若要将一个数字输出为16进制的样子,使用 %x 或%X 输出即可,例如
printf("x is:%x y is:%X",x,y); 参考技术A 楼上解释正确。
不过在MFC里面,不应该使用printf
应该将一个int格式化成为一个CString,然后根据需要赋值或者输出就可以了。
比如:
CString str;
str.Format("Hex show: %x",i); //i存储的就是数值,输出的字符串就是它的16进制表达。
从一个字节中获取 n 位
【中文标题】从一个字节中获取 n 位【英文标题】:Grabbing n bits from a byte 【发布时间】:2013-02-21 17:40:37 【问题描述】:我在时遇到了一点麻烦。
我有一个无符号整数。假设我们的十六进制数是 0x2A,十进制是 42。在二进制中它看起来像这样:0010 1010。我如何获取前 5 位 00101 和接下来的 3 位 010,并将它们放入单独的整数中?
如果有人可以帮助我,那就太好了!我知道如何从一个简单的字节中提取
int x = (number >> (8*n)) & 0xff // n being the # byte
我在另一篇关于堆栈溢出的帖子中看到,但我不确定如何从字节中获取单独的位。如果有人可以帮助我,那就太好了!谢谢!
【问题讨论】:
42 的前 5 (MSB) 位为 00000,因为 int 始终大于 1 个字节。此外,不存在具有十六进制十进制形式的无符号整数。int a = 0x2A;
等同于写int a = 42;
【参考方案1】:
在 C 中“抓取”整数类型的部分是这样的:
-
您将需要的位移到最低位置。
您使用
&
来屏蔽您想要的位 - 1 表示“复制此位”,0 表示“忽略”
所以,在你的例子中。假设我们有一个号码int x = 42;
前 5 位:
(x >> 3) & ((1 << 5)-1);
或
(x >> 3) & 31;
获取低三位:
(x >> 0) & ((1 << 3)-1)
或:
x & 7;
【讨论】:
【参考方案2】:整数在机器内部表示为位序列;对我们人类来说幸运的是,编程语言提供了一种以十进制(或十六进制)显示这些数字的机制,但这不会改变它们的内部表示。
您应该修改按位运算符&
、|
、^
和~
以及移位运算符<<
和>>
,这将帮助您了解如何解决此类问题。
整数的最后3位是:
x & 0x7
从倒数八位开始的五位是:
x >> 3 // all but the last three bits
& 0x1F // the last five bits.
【讨论】:
这与仅将两个子整数存储为两个 32 位整数相比在性能方面如何?提取需要一些时间,但它会慢 32 次操作吗? @InspiredOne:这样的问题不可能在摘要中准确回答,但很明显它提高了内存使用率(相对于两个 32 位整数提高了 8 倍,或者提高了 1 倍)两个相对于两个字节),这提高了缓存性能、内存吞吐量和带宽(如果相关)(传输时间或辅助存储)。由于与这些因素相比,CPU 成本微不足道,因此如果您需要许多实例,压缩数据通常会更快;一对变量不值得这样做(但也没有太大的伤害)。【参考方案3】:您可以为此使用位域。位域是特殊的结构,您可以在其中以位指定变量。
typedef struct
unsigned char a:5;
unsigned char b:3;
my_bit_t;
unsigned char c = 0x42;
my_bit_t * n = &c;
int first = n->a;
int sec = n->b;
位字段在http://www.cs.cf.ac.uk/Dave/C/node13.html#SECTION001320000000000000000有更详细的描述
位域的魅力在于,您不必处理移位运算符等。符号很简单。与操作位一样,存在可移植性问题。
【讨论】:
【参考方案4】:假设您想要顶部的 hi
位和底部的 lo
位。 (在您的示例中为 5 和 3)
top = (n >> lo) & ((1 << hi) - 1)
bottom = n & ((1 << lo) - 1)
解释:
对于 top,首先去掉低位(右移),然后用“全一”掩码屏蔽剩余的位(如果您有像 0010000
这样的二进制数,则减去一个结果 0001111
- 1
s 的数量与原始数量中的 0
-s 数量相同。
底部是一样的,只是不必关心初始移位。
top = (42 >> 3) & ((1 << 5) - 1) = 5 & (32 - 1) = 5 = 00101b
bottom = 42 & ((1 << 3) - 1) = 42 & (8 - 1) = 2 = 010b
【讨论】:
【参考方案5】:int x = (number >> 3) & 0x1f;
会给你一个整数,其中最后 5 位是 number
的 8-4 位,其他位为零。
同样,
int y = number & 0x7;
会给你一个整数,最后 3 位设置 number
的最后 3 位,其余部分为零。
【讨论】:
【参考方案6】:只需去掉代码中的 8*。
int input = 42;
int high3 = input >> 5;
int low5 = input & (32 - 1); // 32 = 2^5
bool isBit3On = input & 4; // 4 = 2^(3-1)
【讨论】:
以上是关于MFC 如何生成一个32位字节的16进制数的主要内容,如果未能解决你的问题,请参考以下文章