如何将4个字符放入一个整数中? 我在C++中开发了一个复制GM缓冲系统来熟悉比特,这样就不错了,但是我遇到了一个问题。如何将4个不同的字符推入一个int?我不擅长按位排序,我从未使用过它。我不知道该怎么做
在这件事上,我有一系列的角色;大小如何将4个字符放入一个整数中? 我在C++中开发了一个复制GM缓冲系统来熟悉比特,这样就不错了,但是我遇到了一个问题。如何将4个不同的字符推入一个int?我不擅长按位排序,我从未使用过它。我不知道该怎么做,c++,bit-shift,C++,Bit Shift,在这件事上,我有一系列的角色;大小byteArraySize并且当我调用grab int函数时,它将从bufferPointer+4到bufferPointer;向后以正确获取int 我读到一个关于位移位(lol)的位,我想我可以将每个字符的位I向右移位。我只是不知道从哪里开始 非常感谢您的帮助。是的,您可以将4个chars(实际上sizeof(int)chars)打包成int。以下是您如何做到这一点: unsigned int packChars(unsigned char *c) { u
byteArraySize
并且当我调用grab int函数时,它将从bufferPointer+4
到bufferPointer
;向后以正确获取int
我读到一个关于位移位(lol)的位,我想我可以将每个字符的位I
向右移位。我只是不知道从哪里开始
非常感谢您的帮助。是的,您可以将4个
char
s(实际上sizeof(int)
char
s)打包成int
。以下是您如何做到这一点:
unsigned int packChars(unsigned char *c)
{
unsigned int val = u0;
for (size_t idx = 0; idx < sizeof(unsigned int); ++idx) {
val |= c[idx] << (idx * CHAR_BIT);
}
}
unsigned int packChars(unsigned char*c)
{
无符号int val=u0;
对于(size_t idx=0;idx val |=c[idx]一种可能的解决方案是使用一个并集,使其所有成员从内存中的同一偏移量对齐
例如:
union Color
{
std::uint32_t m_rgba;
struct
{
std::uint8_t m_a;
std::uint8_t m_b;
std::uint8_t m_g;
std::uint8_t m_r;
};
};
Color white = { 0xffffffff };
首先,您应该知道,sizeof(int)不必是4*sizeof(char)。标准仅保证sizeof(int)>=sizeof(char),仅此而已
事实上,int的大小可以与char的大小相同(或更大),但你永远不会知道,除非你发现了这一点。学究般地说,在纯标准的C++14或C++11中,你可能不知道
顺便说一句,没有什么可以禁止一个假设的C++14实现将所有的char
、short
、unsigned short
、int
、unsigned int
、unsigned long
、unsigned long
、unsigned long
都是相同的类型(至少是相同的内部表示),并且全部是64位,(或96位或128位)和所有的<代码> sieOS< <代码> >。最近的C和C++标准规定长Lo/<代码>至少有64位。
IIRC,一些常见Lisp之上的奇怪的C实现也在做类似的事情
但当然,在实践中没有这样的C++14实现
实际上,在大多数实现中,char
-s是8位字节(可能是有符号的
可能是无符号的
),而int
-s通常是32位字(例如是std::int32_t
),显然可以进行编码
inline int pack4chars(char c1, char c2, char c3, char c4) {
return ((int)(((unsigned char)c1) << 24)
| (int)(((unsigned char)c2) << 16)
| (int)(((unsigned char)c3) << 8)
| (int)((unsigned char)c4));
}
inline int pack4chars(字符c1、字符c2、字符c3、字符c4){
返回((int)((无符号字符)c1)byte0|(byte1我在这里没有看到任何研究成果的证据。这是非常基本和简单的。你尝试过任何东西吗?读过一本书吗?学习编程入门课程吗?我不认为这完全是你的意思……也许是嵌套结构?你是绝对正确的。它通常可以工作,但不幸的是,它显然是未定义的行为。)根据标准:在一个联合体中,最多一个非静态数据成员可以在任何时候处于活动状态,也就是说,最多一个非静态数据成员的值可以在任何时候存储在一个联合体中。这并不意味着它是“显式未定义的行为”。在引用的语句之后,该标准还提到:“联合的大小足以包含其最大的非静态数据成员。分配每个非静态数据成员时,将其视为结构的唯一成员。联合对象的所有非静态数据成员都具有相同的地址"。当访问联合体的成员时,实际上您正在访问与同一联合体的任何其他成员相同的内存区域。@KnightsWatch:您是对的,它不是显式的,但正如它在具有结构类型T1的活动成员的标准布局联合体中明确指出的那样,它被允许读取的另一个联合体成员的非静态数据成员m结构类型T2假设m是T1和T2的公共初始序列的一部分,我假设不允许读取不尊重该序列的数据成员。谢谢,您的代码是我见过的最容易理解的代码!